Mauscursor an Position halten?
-
Hi,
Ich möchte sobald ich in ein Panel klicke dass der Cursor an seiner Position gehalten wird und die Entfernung des Cursors gemessen wird.
So:void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(windowactive) { int deltaX = X-activeX+Form1->Left+Panel1->Left+(Form1->Width-Form1->ClientWidth)/2; int deltaY = Y-activeY+Form1->Top+Panel1->Top+(Form1->Height-Form1->ClientHeight)-(Form1->Width-Form1->ClientWidth)/2; //assuming the bottom border is as thick as the side borders rotx += deltaY/10; roty += deltaX/10; SetCursorPos(activeX,activeY); Panel1->Repaint(); //Force repaint //InvalidateRect(Handle, NULL, false); } }
In meinem Panel wird etwas mit OpenGl gezeichnet.
Mein Problem ist jetzt, dass wenn ich SetCursorPos() aufrufe und dannach wie gewohnt InvalidateRect() das Panel nicht neu gezeichnet wird (Ohne SetCursorPos aber schon). Deshalb rufe ich jetzt jedes mal statt InvalidateRect() Panel1->Repaint() auf was natürlich zu massiver Prozessorlast führt.Weiß jemand wie das ordentlich gemacht wird??
LG
-
Mit SetCursorPos(activeX,activeY) "zwingst" du den Mauszeiger immer wieder an die Position des Klicks zurück!? Warum?
Üblicherweise würde man beim Klick/OnMouseDown einfach die Mausposition zwischenspeichern (und ggf. auf der Zeichenfläche markieren) und dann im MouseMove die Messung zur aktuellen Zeigerposition durchführen.
-
Ich zwinge den Cursor zurück damit man nicht unabsichtlich das Panel verlässt (der Zeiger wird bei erneutem klicken wieder losgelassen).
Ähnlich wie bei first-person Spielen o.Ä.
Die Entfernungsmessung ist nicht das Problem (die funktioniert), aber das Neuzeichnen des Panels funktioniert scheinbar nur mit Repaint().
-
Hi,
schau Dir mal "ClipCursor" an, damit kannst du die Maus "einsperren"
Gruß
Martin
-
@martin_b:
Danke das funktioniert zwar besser aber leider immer noch nicht ohne repaint()
Gibt es vielleicht eine Möglichkeit zu sagen, dass das Panel z.b. alle 30ms neu gezeichnet wird?
Mit einer TTimer Klasse funktioniert es nicht, bzw nur sehr flackernd.LG
-
Kennst du schon dieses OpenGL Beispiel?
http://edn.embarcadero.com/article/10528
Auf deinen Panel kannst du OpenGL rendern aber nutze nicht das OnPaint Ereignis des Panels um das Rendern aufzurufen den das Panel selbst dauert zu lange beim neuzeichnen somit flackert es.
-
@VergissEs:
Nein das kannte ich nicht.
Nach einem kurzem Vergleich hab ich dann die OnIdle()-Funktion von dem Link adaptiert und es funktionierte auf Anhieb einwandfrei ohne repaint() und ohne flackern.
Allerdings nur wenn ich den Cursor nicht fixiere (mit SetCursorPos). Mit ClipCursor() läuft es. Damit kann ich gut leben.
Falls jemand erklären kann was Windows macht damit es mit SetCursorPos() nicht funktioniert wäre das interessant.Danke für die Hilfe
LG
-
Kanns sein dass du nicht eher eigentlich das willst: http://msdn.microsoft.com/en-us/library/ms646262.aspx?