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 1280390 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
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.
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.
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);
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
http://www.pinvoke.net/default.aspx/user32.mouse_event
damit kannst du ein klick auf einer bestimmten position auslösen.
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
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
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;
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
Mahlzeit,
hat keiner eine Idee, bin vollkommen ratlos wo das Problem liegen könnte.
Gruss
Simon
der Debugger wirft keinen Fehler, der Mauszeiger bewegt bzw. springt genau dahin wo mein finger ist.
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
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