myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Form an Mauszeiger binden
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Form an Mauszeiger binden

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB


axawd ist offline

Form an Mauszeiger binden

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

es geht um folgendes:

Ich habe eine kleine Form (w=100;h=88), die 5 Buttons beinhaltet. 4 (38x38) werden mit Operationen belegt, der 5. Button (20x20) beendet die Form. Die Form wird mittig zum Mauszeiger geladen.

Das Besondere ist, dass die Form der Maus folgen soll. Klartext: wenn der Mauszeiger den oberen Rand der Form erreicht, soll die Form der Mausbewegung nach oben folgen. Das soll natürlich für alle 4 Seiten der Form gelten.

Mein Problem: Ich kann zwar die Form wie gewünscht verschieben, jedoch nur wenn ich die Maus ganz langsam bewege. Wird die Maus schneller bewegt, komme ich aus der Form raus.

Kann mir jemand helfen?

Vielen Dank.

C#-Code:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Point mouseOffset;

        int xOffset;
        int yOffset;

        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X - 50, mouseOffset.Y - 44);
            Location = mousePos;

            Refresh();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.X == 2)
            {
                xOffset = -e.X - 2;
                yOffset = - e.Y;

                mouseOffset = new Point(xOffset, yOffset);
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X, mouseOffset.Y);
                Location = mousePos;

                Refresh();
            }
            else if (e.X == 98)
            {
                xOffset = -e.X + 2;
                yOffset = -e.Y;

                mouseOffset = new Point(xOffset, yOffset);
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X, mouseOffset.Y);
                Location = mousePos;

                Refresh();
            }
            else if (e.Y == 2)
            {
                xOffset = -e.X;
                yOffset = -e.Y - 2;

                mouseOffset = new Point(xOffset, yOffset);
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X, mouseOffset.Y);
                Location = mousePos;

                Refresh();
            }
            else if (e.Y == 86)
            {
                xOffset = -e.X;
                yOffset = -e.Y + 2;

                mouseOffset = new Point(xOffset, yOffset);
                Point mousePos = Control.MousePosition;
                mousePos.Offset(mouseOffset.X, mouseOffset.Y);
                Location = mousePos;

                Refresh();
            }

            //mouseOffset = new Point(xOffset, yOffset);
            //Point mousePos = Control.MousePosition;
            //mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            //Location = mousePos;

            Refresh();
        }


        private void button5_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form1_LocationChanged(object sender, EventArgs e)
        {
            Refresh();
        }

    }
}
05.05.2009 11:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tom-essen tom-essen ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2140.png


Dabei seit: 15.05.2005
Beiträge: 1.815
Entwicklungsumgebung: VS.NET 2013
Herkunft: NRW


tom-essen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo!

Dafür wirst du wohl globale Maus-Hooks verwenden müssen, da die Form bei zuschnellen Mausbewegungen nicht mitkommt, bzw. der Maustreiber bei zu schnellen Bewegungen nicht jede Zwischenposition meldet.
05.05.2009 11:11 Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@ tom-essen

danke für die Antwort. Das habe ich mir fast gedacht... Könntest du mir bitte sagen wie ich das machen soll?
05.05.2009 11:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.464
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo axawd,

Zitat:
Könntest du mir bitte sagen wie ich das machen soll?

ja, benutze erstmal die Suche. Wenn sich dann Probleme ergeben, stelle möglichst konkrete Fragen.

herbivore
05.05.2009 11:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

du kannst aber auch auf das mouseleave ereigniss horchen und dort zusätzlich reagieren.
05.05.2009 11:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@ JAck30lena

mouseleave bringt nicht viel, weil das auch beim Button-Überfahren innerhalb der Form stattfindet unglücklich
05.05.2009 11:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@ herbivore

Danke für die Info. Wird schon gemacht.
05.05.2009 11:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kalleberlin Kalleberlin ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.06.2007
Beiträge: 165


Kalleberlin ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von axawd:
@ JAck30lena

mouseleave bringt nicht viel, weil das auch beim Button-Überfahren innerhalb der Form stattfindet :(

Du würdest ja rausbekommen ob das Event beim Button-Überfahren auslöst, oder eben wann Du es wirklich brauchst (einfach Prüfen ob an der Mouse location nen button ist oder nicht).

Ich denke das geht auch ohne Global-Hook.

//kalleberlin
05.05.2009 12:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

bei einem globalen hook müsstest du genauso prüfen ob du gerade verschieben musst oder auch nciht, da dieser auch innerhalb deiner form über buttons z.b. ausgelöst wird.

Zitat:
mouseleave bringt nicht viel, weil das auch beim Button-Überfahren innerhalb der Form stattfindet

->

Zitat:
(einfach Prüfen ob an der Mouse location nen button ist oder nicht).

ACK
05.05.2009 12:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ok, mach ich gleich
05.05.2009 13:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habs mit MouseLeave probiert, es gab aber keine nennenswerten Verbesserungen.

Die MouseMove Lösung (wie oben gepostet) funktioniert schon. Das Problem ist, dass man dabei die Maus nicht schnell bewegen darf. Tue ich das, springt der Zeiger raus und ich verliere die Form. Glaube die Frage lautet: Wie kann ich die Maus bei jeder Geschwindigkeit in der Form behalten?
05.05.2009 14:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Maus bei jeder Geschwindigkeit in der Form behalten?

das ist einfach. du kannst der mouse einen aktionsradius zuweisen und somit das "aus der form springen" komplett unterbinden.

edit:

Zitat:
dass man dabei die Maus nicht schnell bewegen darf. Tue ich das, springt der Zeiger raus und ich verliere die Form.

dann setze die form doch wieder unterhalb des mousezeigers innerhalb des events?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JAck30lena am 05.05.2009 14:49.

05.05.2009 14:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke, es klingt gut. Werde es gleich ausprobieren.
05.05.2009 14:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

05.05.2009 15:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

API ist in diesem fall nicht notwendig. das geht mit framework-bordmitteln genausogut.
05.05.2009 15:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Probiers mal aus. Die Geschwindigkeit ist schon beeindruckend - ein Beschränken des Mausradius nicht erf.
05.05.2009 15:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das funktioniert in diesem fall nciht, da er ohne klicken oder ähnliches erst beim bewegen an den rand der form, diese mitlaufen lassen will.


btw: das ist aber ein ziemlicher scheiss wenn der user gezwungen wird hier irgendeine interaktion zu tätigen, bevor er etwas anderes machen darf. usability technisch ist das ein supergau.
05.05.2009 15:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ja, stimmt, da ist man wieder bei

Public Shared Property Clip() As System.Drawing.Rectangle
Member von System.Windows.Forms.Cursor
Zusammenfassung:
Ruft die Begrenzungen ab, die das Auswahlrechteck für den Cursor darstellen, oder legt diese fest.

Jo, und vom Design würde mich das auch nerven, wenns Form anne Maus klebt wie Sch... am Schuh. Augenzwinkern

Gängiger wäre doch Form.ShowDialog() und fertig, tätich denken.
05.05.2009 16:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

---> @ JAck30lena <---

Danke! Es hat funktioniert.

Habe allerdings noch ein Problemchen mit der Geschwindigkeit. Ich sehe momentan keine weitere Möglichkeit die Bewegung zu beschleunigen. Es ist flüssiger wenn ich die Location jedes mal in der Schleife zuweise und nicht am Ende. Das ganze sollte 2-4x schneller werden.

C#-Code:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    Cursor.Clip = new Rectangle(this.Location, this.Size);

    int xOffset;
    int yOffset;

    int speed = 5;

    if (e.X < 1)
    {
        xOffset = -e.X - speed;
        yOffset = -e.Y;

        mouseOffset = new Point(xOffset, yOffset);
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        Location = mousePos;

        Refresh();
    }
    else if (e.X > 108)
    {
        xOffset = -e.X + speed;
        yOffset = -e.Y;

        mouseOffset = new Point(xOffset, yOffset);
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        Location = mousePos;

       Refresh();
    }
    else if (e.Y < 1)
    {
        xOffset = -e.X;
        yOffset = -e.Y - speed;

        mouseOffset = new Point(xOffset, yOffset);
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        Location = mousePos;

        Refresh();
    }
    else if (e.Y > 88)
    {
        xOffset = -e.X;
        yOffset = -e.Y + speed;

        mouseOffset = new Point(xOffset, yOffset);
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        Location = mousePos;

        Refresh();
    }

    //mouseOffset = new Point(xOffset, yOffset);
    //Point mousePos = Control.MousePosition;
    //mousePos.Offset(mouseOffset.X, mouseOffset.Y);
    //Location = mousePos;

    //Refresh();
}
05.05.2009 16:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

---> @ ErfinderDesRades <---

lol! Die Form soll später auch Wheel heißen und immer ein paar nützliche Funktionen in sich tragen. So sind diese immer bereit & in der Nähe des Kursors. Die gewünschte Vorgehensweise wäre dann: Funktion picken / form ausblenden / Funktion ausführen / Form einblenden.
05.05.2009 16:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C#-Code:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sch_AmSchuh {

   public partial class frmSch_AmSchuh : Form {

      private Size _offs;

      public frmSch_AmSchuh() {
         InitializeComponent();
         this.MouseLeave += (s, e) => frmSch_AmSchuh_MouseLeave();
         this.MouseMove += frmSch_AmSchuh_MouseMove;
      }

      void frmSch_AmSchuh_MouseMove(object sender, MouseEventArgs e) {
         _offs = new Size(Control.MousePosition - new Size(this.Location));
      }

      private void frmSch_AmSchuh_MouseLeave() {
         var pt = Control.MousePosition;
         if (this.RectangleToScreen(this.ClientRectangle).Contains(pt)) return;
         this.Location = pt - _offs; ;
         //den Cursor noch eine kl. Stück hinter die Bande zwingen, weil manchmal schaffters doch raus
         var rct = this.RectangleToScreen(this.ClientRectangle);
         rct.Inflate(-2, -2);
         Cursor.Clip = rct;
         Cursor.Clip = Rectangle.Empty;
      }

   }
}
05.05.2009 18:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

--> @ ErfinderDesRades <--

Danke für die coole Lösung! Es funktioniert ganz gut und sauschnell ist es auch!

Die Sache hat noch einen kleinen Hacken. Bei schnellen Mausbewegungen, verliert man die Form.

Änderungen in "rct.Inflate(-2, -2);" haben auch keine Verbesserung gebracht.

Das Problem liegt an "if (this.RectangleToScreen(this.ClientRectangle).Contains(pt)) return;". Kommentiert man es aus, verliert man die Form nicht mehr. Dafür bleiben aber die Buttons innerhalb der Form unerreichbar.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von axawd am 06.05.2009 11:50.

06.05.2009 10:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.287


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C#-Code:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sch_AmSchuh {

   public partial class frmSch_AmSchuh : Form {

      private Size _offs;

      public frmSch_AmSchuh() {
         InitializeComponent();
         Action<Control> register=null;
         register = ctl => {
            ctl.MouseMove += frmSch_AmSchuh_MouseMove;
            ctl.MouseLeave += frmSch_AmSchuh_MouseLeave;
            foreach (Control c in ctl.Controls) register(c);
         };
         register(this);
      }

      void frmSch_AmSchuh_MouseLeave(object sender, EventArgs e) {
         var pt = Control.MousePosition;
         if (this.RectangleToScreen(this.ClientRectangle).Contains(pt)) return;
         this.Location = pt - _offs; ;
         //den Cursor noch eine kl. Stück hinter die Bande zwingen, weil manchmal schaffters doch raus
         var rct = this.RectangleToScreen(this.ClientRectangle);
         rct.Inflate(-2, -2);
         Cursor.Clip = rct;
         Cursor.Clip = Rectangle.Empty;
      }

      void frmSch_AmSchuh_MouseMove(object sender, MouseEventArgs e) {
         _offs = new Size(Control.MousePosition - new Size(this.Location));
      }

   }
}

Jetzt werden die Events für alle Controls auffm Form registriert.
Bei mir gehter nicht mehr raus fröhlich
06.05.2009 13:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axawd axawd ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.05.2009
Beiträge: 20
Entwicklungsumgebung: C#, VB.NET, VB

Themenstarter Thema begonnen von axawd

axawd ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

---> @ ErfinderDesRades <---

Ja, jetzt klebt die Sch_ richtig am Schuh! Danke schön, du hast mir sehr geholfen.
06.05.2009 13:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Jahre.
Der letzte Beitrag ist älter als 10 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.01.2020 17:52