AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Cursor einfangen

Ein Thema von wendelin · begonnen am 11. Mär 2021 · letzter Beitrag vom 30. Mai 2021
Antwort Antwort
Seite 1 von 2  1 2      
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#1

Cursor einfangen

  Alt 11. Mär 2021, 18:49
Hallo,
ich habe eine Frage zum Cursor.

Vor einiger Zeit benutzte ich ein Programm (Chartprogramm) in welchem ein Fadencursor (senkrechte Linie) verwendet wurde.
Bitte stellt Euch ein horizontal angeordnetes Lineal vor. Wenn man nun die Maus nur ein wenig nach links oder rechts bewegte passierte nichts.
Wenn man jedoch die Maus z.B. über die halbe Entfernung zur nächsten Zahl bewegte sprang der Cursor auf diese.

Wie programmiert man so etwas ?

Vielen Dank für Eure Antworten.

Wendelin
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Cursor einfangen

  Alt 11. Mär 2021, 18:57
Schau Dir mal diese Demo an.
Da wird Dir gezeigt womit man den Cursor überhaupt ändern könnte.

Mit ClientToScreen könnte man die Cursor-Position auswerten (wie nah am Ziel-Objekt)

Am einfachsten ist es per OnMouseEnter/OnMouseLeave Ereignis, da einfach Cursor austauschen/zurücksetzen mit Code von oben.

Das wäre zumindest schon mal ein Anfang.

//edit

oh, ich glaube ich habe da was falsch verstanden.
SetFocus() müsste das gewünschte sein anstelle das mit dem Cursor-Bild-Tausch.
Gruß vom KodeZwerg

Geändert von KodeZwerg (11. Mär 2021 um 19:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#3

AW: Cursor einfangen

  Alt 11. Mär 2021, 19:50
Mouse (globale Variable in Vcl.Controls.pas)
Delphi-Referenz durchsuchenTMouse.CursorPos

MSDN-Library durchsuchenGetCursorPos
MSDN-Library durchsuchenSetCursorPos
MSDN-Library durchsuchenClipCursor

Positionen z.B. im MouseEvent von/zu Monitor sind mit ClientToScreen/ScreenToClient umzurechnen.


Ich empfehle aber niemals die Maus festzuhalten. (ich jedenfalls hab gern mal mordgelüste, wenn jemand der Meinung ist mir sowas antun zu wollen)
Aber das was man mit der Maus zieht, das darf man gern grade rücken, also z.B. auf den nächstliegenden Winkel zu runden.
siehe z.B. MS-Office mit Strg/Shift oder die Linie in Paint zusammen mit Shift, wo man mit Strg+ und/oder Shift+Mausbegen das Gemalte ausrichten kann, aber da niemals die Maus selbst vergewaltigt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Mär 2021 um 20:14 Uhr)
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Cursor einfangen

  Alt 12. Mär 2021, 11:18
Hallo,

vielen Dank für Eure Antworten.

Leider kann ich mit Euren Antworten nicht allzu viel anfangen.
Ich bin halt ein reiner Autodidakt.

Um es nochmals beispielhaft zu erklären : Stellt Euch ein virtuelles graphisches Lineal vor.
10 cm Länge, die mm-Angaben zwischen 1,2.. 10 cm sollen vom Cursor übersprungen werden.
D.h. wir haben es hier mit diskreten Abständen zu tun, welche sich je nach Graphic-Auflösung
ändern können. Wenn ich also den Cursor auf 1(cm) stehen habe und die (physikalische) Maus
gleichmäßig in Richtung 10(cm) ziehe, soll der Cursor zur 2(cm).. 3(cm) bis zur 10(cm) springen
ohne in den Zwischenräumen sichtbar zu sein.
Ich will auch nicht die (physikalische) Maus auf meinem Schreibtisch festhalten, sondern nur den
(graphischen Cursor) auf dem Bildschirm für ein bestimmtes Intervall.

Noch eine Frage. Kennt jemand villeicht den Namen für diese Funktion (falls es sie gibt) ?
Ich würde sie z.B. "Flip-Cursor" nennen.

Wendelin
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Cursor einfangen

  Alt 12. Mär 2021, 13:34
Das was Du Linieal nennst sind bei anderen lediglich Koordinaten.
Für Koordinaten hast Du oben bereits alles stehen was Du brauchst.


Angenommen Du hast ein Control mit einem Image von einem Teil eines Lineals.
Mit GetCursorPos() in einem Timer aktuelle Maus Koordinate holen.

Mit ClientToScreen/ScreenToClient diese Werte abgleichen um zu prüfen wie "nah" der Cursor am Teil des Lineals ist.

Ab einer von Dir gewünschten unter-Grenze mit SetCursorPos() den Cursor in das Control mit dem Teil des Lineals befördern.

Wenn Du ein Control fertig hast, so das der Timer alles brav verrichtet was er soll, füge nun mehr Controls mit mehr Teilabschnitten des Lineals hinzu und gebe dem Timer auch diese als Sprungziele an.

Du kannst auch ein großes Control mit dem kompletten Lineal machen und da dann eine eigene Maßeinheit für entwickeln,
Delphi macht meist alles mit


//edit
ich halte von dieser idee übrigens gar nichts. mich würde es als user verwirren wenn sich die maus nicht so verhält wie man es gewohnt ist.
okay, für default-Jumps bin ich zu haben (nach aktion X bekommt control Y den focus und die maus hüpft mit dahin) aber vom verschwinden des Cursors kann ich nur abraten.
Lass mal dann deine App abstürzen und der Kunde sitzt da... so ohne sichtbare maus... also ich würde so etwas nicht gut heissen.

ps:
die obige taktik gilt auch wenn du irgendwelche punkte im image als sprungziele bestimmst... also lineal mit cm und mm angabe, da nur du wissen kannst auf welchen pixel welcher wert ist kann ich dir nur bis hierhin hilfe geben.
Gruß vom KodeZwerg

Geändert von KodeZwerg (12. Mär 2021 um 14:03 Uhr) Grund: weil es freitag ist
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Cursor einfangen

  Alt 12. Mär 2021, 16:16
Ich denke, hier sollte nicht der Cursor "springen", sondern das Lineal. Also vielleicht so etwas in der Art?
Delphi-Quellcode:
// ein Bevel auf die Form packen
// OnMouseMove der Form:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Bevel1.Left := Round(x/50) * 50;
end;
In einigen Programmen hat man ja so eine Raster-Funktion. Da wird auch nicht der Mauscursor an sich so eingefangen, sondern nur die aktiven Objekte. Meistens aber in Form einer Drag&Drop-Methode, nicht direkt beim bloßen Bewegen der Maus.
The angels have the phone box.
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Cursor einfangen

  Alt 12. Mär 2021, 17:29
Hallo Kodezwerg,

vielen Dank für Deine ausführliche Antwort.
Ich denke, daß Deine Vorschläge mir weiter helfen werden.

Wendelin
Wolfgang
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Cursor einfangen

  Alt 7. Mai 2021, 23:56
Hallo,

nochmals vielen Dank für Eure Antworten.
Ich muß mich entschuldigen. Ich hatte geschrieben, daß in dem Beispielprogramm (Chartprogramm mit Candlesticks) der Cursor, wenn er weiter von
einer Position zur nächsten springt ( nur in x-Richtung) kurzzeitig verschwinden würde. Dies ist jedoch nicht der Fall. Es war eine optische
Täuschung. Es kam daher, da ich eine sehr geringe Auflösung ( sehr viele kurs-werte ) eingestellt hatte. Bei einer höheren Auflösung war der
Crosshair- Cursor immer zu sehen.
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?

Wendelin (Wolfgang)
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Cursor einfangen

  Alt 8. Mai 2021, 01:20
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?
Guten Abend,
bei meinen Vorschlägen ging es immer darum das die Anwendung zu jeder Zeit weiß wo sich der Maus-Cursor befindet.
Um dies zu erreichen benötigt man einen Timer der die Position/Koordinate abfragt und an die Anwendung weiterleitet um dann entsprechende Aktionen auszuführen oder eben keine.

-> TTimer Komponente aufs Formular ziehen, doppelklicken und Code einfügen.
-> TTimer Komponente einen Sinnvollen Interval geben und aktivieren.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 8. Mai 2021 um 01:22 Uhr)
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Cursor einfangen

  Alt 11. Mai 2021, 19:07
Danke KodeZwerg,

ich werde versuchen Deine Anregungen umzusetzen.
Falls es klappt werde ich Dich informieren (mit source-code).

Wendelin (Wolfgang)
Wolfgang
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz