Laden...

Maus Zeiger auf Form1 auf Form2 anzeigen und steuern

Erstellt von Simon Heinzmann vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.449 Views
Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren
Maus Zeiger auf Form1 auf Form2 anzeigen und steuern

Hallo,

folgender Aufbau bereitet mir noch Probleme. Ich programmiere eine Multimonitoranwendung mit Browserfunktion, einem Touchscreen und einem weiteren Bildschirm.

Daten:
Touchscreen 480640 Pixel, Form1 mit UserControl Bildschirmtastatur, URL Textbox und Go-Button
Bildschirm 1280
390 Pixel, Form2 mit Webbrowserfenster

Die URL Eingabe erfolgt über eine Bildschirmtastatur, nach dem drücken des Go-Button wird wird die Bildschirmtastatur, URL Textbox und Go-Button ausgeblendet.

Problem:
Nach der Eingabe soll das Touchscreen als Touchpad wie bei einem Laptop funktionieren, aber wie bringe ich dem Mousezeiger bei das er sich nur nur in Form2 bewegen darf und von Form1 aus gesteuert werden kann.

Gruss

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Nachtrag:

Die Control.MousePosition.X ich nicht ändern.

Der Rückgabewert "System.Windows.Forms.Control.MousePosition" kann nicht geändert werden, da er keine Variable ist.

Gelöschter Account
vor 15 Jahren

du kannst dem mousezeiger eine clientarea zuweisen (Cursor.Clip), die er dann nciht verlassen kann.

wie sich das dann verhält, wenn du auf dem touchscreen rumdrückst weiß ich allerdings nciht. wenn du glück hast werden die mouseevents trotzdem geworfen, dann müsstest du nur die koordinaten übertragen (Cursor.Position). ansonsten sieht es ziemlich schlecht aus.

4.938 Beiträge seit 2008
vor 15 Jahren

Mit der globalen Klasse 'Cursor' kannst du die Mausposition setzen als auch evtl. Clipping durchführen:


Cursor.Position = new Point(x, y);

Cursor.Clip = new Rectangle(x, y, w, h);

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hi,

danke für die Tips an The69 und JAck30lena, ich verschieb einfach den Mauszeiger nach links weil dort in der Windowskonfiguration der Monitor mit Form2 angeordnet ist.

        private void FormBrowserSteuerung_MouseMove(object sender, MouseEventArgs e)
        {

            if (Control.MousePosition.X > 0 && Control.MousePosition.X < 480)
            {
                // this.Cursor = new Cursor(Cursor.Handle);
                Cursor.Position = new Point((Cursor.Position.X * 3) - 1280, Cursor.Position.Y);
            }
        }

Das gleiche hab ich mit MouseDown und Mouse Up gemacht.

Die Mouse gewegt sich wunderbar auf Form2 aber ich kann keine Links anklicken, habt ihr da irgendwelche Ideen?

Gruss

Gelöschter Account
vor 15 Jahren

http://www.pinvoke.net/default.aspx/user32.mouse_event

damit kannst du ein klick auf einer bestimmten position auslösen.

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hi,
das mit dem Klicken funktioniert wunderbar. Die ganze Steuerung ist durch die Multiplikation und die unschärfe des Touchscreens nicht brauchbar.

Meine Neue Idee ist es wie bei einem Touchpad auf einem Laptop zu lösen, d.h. die Verschiebung des Cursor erfolgt 1:1 zu dem der Bewegung auf dem Touchscreen.


        // Mouseposition         
        int x;
        int y;
        // Ausgangsmauskoordinaten
        int AusgangsKordsX;
        int AusgangsKordsY;

        private void FormBrowserSteuerung_MouseMove(object sender, MouseEventArgs e)
        {
            // Touchscreenfläche
            if (e.X > 0 && e.X < 480 && e.Y < 500)
            {
  
                // Berechnung der Koordinaten
                x = x + (e.X - AusgangsKordsX);
                y = y + (e.Y - AusgangsKordsY);

                // Ausgangskoordinaten setzen
                AusgangsKordsX = e.X;
                AusgangsKordsY = e.Y;

                // Cursor Position setzen
                Cursor.Position = new Point(x, y);
            }

Ich komme damit nicht über den Touchscreen Bildschirm hinaus... Ich finde einfach nicht den fehler in der Logik.

Gruss und Danke

D
171 Beiträge seit 2008
vor 15 Jahren

Hallo

Das problem ist das du e.X- Ausgangkordinaten rechnest.

Wenn du am ende angekommen bist, angenommen an der rechten seit, dann setzt du ja bei einem Touchpad Links wieder neu an. betrachte nur die X Position

x = 400
AusgangsPos =401
e.X umgesetzt ist 2

jetzt rechnest du

x= 400+(2-401)
also
400+(-399)
ist also 1

durch dieses Verhältnis kannst du nie größer werden als die Fläche deines Touchpanels. Hier müsstes du Plus rechnen, weiß nur nicht ob du dann kleiner als die Ausgangsposition werden kannst, rechne doch mal einfach ein paar varianten durch

D
171 Beiträge seit 2008
vor 15 Jahren

AusgangsKords ist doch eigentlcih gleich x bzw Y oder?

du verwendest deine alte funktion und baust das hier mit ein

also
tmp=2-401 (ersterfall, weiter nach rechts)
tmp=401-2 (zeiterfall, weiter nach links)


if (tmp!=1||tmp!=-1)//nur dann wird ja gesprungen
{
if (tmp<0)
{
    tmp+=AusgangsKords;  //hier wieder 2 (-399+401)
//bewegung um 2 nach rechts
}else
{
if (tmp>0)
{
   tmp-=Ausgangskords  //also(399-401) resultat-2
}
}

}
x=x+tmp;
Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hi,

ich komm irgendwie nicht weiter, der Cursor kommt einfach nicht über die Touchscreenfläche hinaus

public partial class FormBrowserSteuerung : Form
    {
        public FormBrowserSteuerung()
        {
            InitializeComponent();
        }
        // Variablendeklaration        
        int ausgangsKordsX;
        int ausgangsKordsY;
        int absolutKordsX;
        int absolutKordsY;        

        private void FormBrowserSteuerung_MouseMove(object sender, MouseEventArgs e)
        {
            // Touchscreenfläche
            if (e.X > 0 && e.X < 480 && e.Y < 500)
            {
                // Berechnung der Koordinaten
                int verschiebungX = MousePosition.X - ausgangsKordsX;
                int verschiebungY = MousePosition.Y - ausgangsKordsY;

                absolutKordsX += verschiebungX;
                absolutKordsY += verschiebungY;

                ausgangsKordsX = MousePosition.X;
                ausgangsKordsY = MousePosition.Y;

                Cursor.Position = new Point(absolutKordsX, absolutKordsY);

            }
         }
    }

Kann es sein das jedes mal wenn MouseMove ausgeführt wurde die Werte ausgangsKordsX usw. nicht gespeichert werden.

Bin für jeden Tip dankbar.

Gruss
Simon

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Mahlzeit,

hat keiner eine Idee, bin vollkommen ratlos wo das Problem liegen könnte.

Gruss
Simon

Gelöschter Account
vor 15 Jahren

was sagt der debugger zu den koordinaten?

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

der Debugger wirft keinen Fehler, der Mauszeiger bewegt bzw. springt genau dahin wo mein finger ist.

Gelöschter Account
vor 15 Jahren

mir ist klar das der debugger keine fehler anzeigt. (werfen tut er sie hoffentlich nie).
ich wollte wissen ob laut debugger die koordinaten richtig sind. ob die berechnung auch passt. ob nciht doch irgendwo ein lasches zwischenergebniss vorliegt....

D
171 Beiträge seit 2008
vor 15 Jahren

hab dir doch ne idee geschrieben, hast du die Probiert, wenn diese FGunktion im Mouse Move Event kommt, dann versuch doch mal die abfrage ob die abweichung gleich 1 ist, wie oben beschrieben

D
171 Beiträge seit 2008
vor 15 Jahren

Ok ich habe kurz nochmal nachgedacht.

Du musst dir die Koordinaten auf dem Panel und die Koordinaten auf dem Monitor merken.

Wenn die änderung auf dem Pannel !=1 oder !=-1 ist, musst du nur die neuen Panelkoordinaten in den Variablen speichern.

Ansonsten bildest du die differenz der alten und neuen Panell koordinaten und addierst die zu denen auf dem Monitor, und speicherst die neuen Panelkoordinaten ab.

Versuch das mal, sollte gehen