Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Relative Positionierung der Maus (https://www.delphipraxis.net/58220-relative-positionierung-der-maus.html)

Jan 3. Dez 2005 12:40


Relative Positionierung der Maus
 
Hallo DPler!

Ich habe folgendes Problem:
Ich will den Mauszeiger in der Mitte des Forms platzieren.

bisher mache ich das so:


Delphi-Quellcode:
var muh : Types.TPoint;
    maus : TMouse;
...

    muh.x:=Round(ClientWidth/2)+form1.Left+4;
    muh.y:=Round(ClientHeight/2)+form1.Top+26;
    maus.CursorPos:=muh;
Allerdings ist diese Methode abhängig von der Breite des Rahmens, und da dieser Rahmen anscheinend nicht überall gleich ist funktioniert diese Methode nicht 100%ig auf anderen Rechnern. Außerdem glaube ich nicht, dass diese Methode auch im Vollbildmodus klappen würde.
Dass ich die Maus nur über die Bildschirmkoordinaten positionieren kann finde ich etwas ärgerlich und ich glaube, dass das auch anders gehen muss, da man im onMouseMove event ja auch relative Form-Mauskoordinaten bekommt.
Kann man also die Maus irgendwie mit relativen Form-koordinaten positionieren?

Gruß
Jan

Luckie 3. Dez 2005 12:44

Re: Relative Positionierung der Maus
 
Mit MSDN-Library durchsuchengetSystemmetrics kannst du ermitteln, wie breit der Rand eines Fenster und wie hoch dessen Titelzeile ist.

Jan 3. Dez 2005 13:23

Re: Relative Positionierung der Maus
 
Hallo Luckie!

Danke für den Tip,
allerdings bekomme ich da andere Werte raus, als die, die ich durch ausprobieren an meinem Rechner herausbekommen habe.

Ich bekomme jetzt statt der 4px für den Horizontalen Rahmen und der 26px für den vertikalen, oberen Rahmen mit folgendem Code:


Delphi-Quellcode:
    muh.x:=Round(ClientWidth/2)+form1.Left+GetSystemMetrics(SM_CXBORDER);
    muh.y:=Round(ClientHeight/2)+GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYBORDER);
einen pixel und 23 pixel raus.
Welche Befehle brauche ich da genau?

Gruß
Jan

Jan 3. Dez 2005 13:40

Re: Relative Positionierung der Maus
 
Hallo,
hab nochmal intensiv und mit abgewandelten Suchbegriffen und ich weniger eindeutig benannten threads hier gesucht und bin auf die function clienttoscreen gestoßen.
Mit folgendem Code geht das ganze jetzt:

Delphi-Quellcode:
    muh.x:=Round(ClientWidth/2);
    muh.Y:=Round(ClientHeight/2);
    muh:=form1.ClientToScreen(muh);
    maus.CursorPos:=muh;

Robert Marquardt 3. Dez 2005 14:22

Re: Relative Positionierung der Maus
 
Warum nimmst du denn nicht Width und Height statt ClientWidth und ClientHeight?

Jan 3. Dez 2005 18:26

Re: Relative Positionierung der Maus
 
Hallo Robert,
das liegt daran, dass das ganze ein OpenGL Projekt ist, wo ich den Mauszeiger zentriert halte und die Auslenkung des Mauszeigers von der Mitte des Viewports im MouseMove event ermittle, welche ich dann in meinen Kamerakoordinaten berücksichtige und den Mauszeiger wieder auf die Mitte des Viewports setze. Und wenn ich da dann jetzt einfach nur height und width nehmen würde, dann wäre die vertikale Blickrichtung nicht mittig im Viewport, da ich ja oben einen höheren Rahmen habe als unten.
Gruß
Jan

Robert Marquardt 4. Dez 2005 06:12

Re: Relative Positionierung der Maus
 
Es sind jetzt aber alle noetigen Elemente da. Mit ClientRect und Width und Height kann man bestimmen wie das
ClientRect relativ zum Fenster steht. ClientToScreen der Form kann dann Positionen relativ zum Fenster der Formm umrechnen.

Jan 4. Dez 2005 08:43

Re: Relative Positionierung der Maus
 
Hallo Robert,
hast du meinen Beitrag direkt vor deiner Frage gelesen?
Mit clienttoscreen und mit clientwidth und clientheight klappt das ganze doch jetzt einwandfrei.
Da muss ich garnichts mehr großartig berechnen.
Aber danke für deine Bemühung.
Gruß
Jan


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 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