Mauskoordinaten -> Fensterkoordinaten



  • Hallo!
    Folgendes Problemchen: Ich möchte die Mauskoordinaten, die ich z.B. mit GetCursorPos() ermitteln kann in Fensterkoordinaten (= die Koordinaten, die man z.B. benutzt, um einen Button zu platzieren) umrechnen. Ein Fenster vom Typ TForm hat normalerweise ja noch 'ne Titelleiste und auch an den Seiten (wobei aber nur die linke interessiert) hat ein Fenster einen gewissen Rand. Und außerdem kann man es verschieben, sodass seine Position nicht immer (0|0) ist.

    Hoffe ihr wisst, was ich meine und habt 'ne Lösung auf Lager. 😉

    Mr Train



  • Die Funktion die du suchst dürfte das hier sein: http://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx

    Eigenschaft "SM_CXBORDER"

    MfG
    TFX



  • Danke für die Antwort! 👍
    Die Funktion scheint richtig zu sein, aber nicht mit der Eigenschaft "SM_CXBORDER". Die liefert bei mir irgendwie nur 1.

    So wie es aussieht, muss man für die Breite der linken Grenze SM_CXSIZEFRAME benutzen und für die Höhe der gesamten Titelleiste ( ⚠ die besteht nämlich aus der Titelleiste selbst und der vertikalen Rahmengröße 💡 ) SM_CYCAPTION + SM_CYSIZEFRAME.

    Hoffe, das liefert auf anderen PCs auch die gewünschten Ergebnisse. 😃

    Mr Train



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • So ganz deutlich ist die Frage jetzt nicht. Möchtest du herausfinden, wie breit die Fensterrahmen und wie hoch die Titelleiste eines Fensters ist oder möchtest du absolute Bildschirmkoordinaten in relative Fensterkoordinaten umrechnen?
    Zum ersten Fall weiss ich nix, aber GetSystemMetrics hört sich schon ganz gut an. Zum zweiten Fall gibt es die Win32 Funktionen ScreenToClient und ClientToScreen sowie die Member ScreenToClient und ClientToScreen der TControl Klasse.



  • Möchtest du herausfinden, wie breit die Fensterrahmen und wie hoch die Titelleiste eines Fensters ist oder möchtest du absolute Bildschirmkoordinaten in relative Fensterkoordinaten umrechnen?

    Das Zweite. Aber um die relativen Fensterkoordinaten auszurechnen braucht man eben die Höhe / Breite vom Fensterrahmen (es sei denn, man kennt die ScreenToClient()-Methode).



  • Kommt drauf an, was du haben möchtest. Die Funktionen ScreenToClient und ClientToScreen konvertieren Bildschirmkoordinaten oder Client Koordinaten ineinander, wenn du allerdings die NC Koordinaten eines Fensters haben möchtest, weil du die Positionen des Rahmens oder des Fenstertitels haben willst musst du dir diese Informationen selbst beschaffen.
    Was hast du denn genau vor?



  • Was hast du denn genau vor?

    Ich schreibe gerade einen Editor für ein eigenes Grafikformat. Das kann man sich wie Paint vorstellen (nur in 3D). Man kann Punkte also mit der Maus platzieren. Dazu brauche ich natürlich die Mauskoordinaten relativ zur Zeichenfläche, kenne aber nur die Koordinaten relativ zur linken oberen Ecke im Fenster.

    Das Problem ist eigentlich schon mit GetSystemMetrics() gelöst. Was meinst du mit "NC Koordinaten"?

    Mr Train



  • Mit NC Koordinaten meinte ich Koordinaten der non-client area eines Fensters. Das sind zB der Fensterrahmen oder die Titelleiste des Fensters. Normalerweise benutzt mann nur den "Netto" Bereich eines Fensters, da sich das Betriebssystem um den Rahmen und die Titelleiste kümmert. Manchmal möchte man aber selbst dort zeichnen und dafür braucht man dann die Koordinaten der non client area.



  • Mr Train schrieb:

    Was hast du denn genau vor?

    Ich schreibe gerade einen Editor für ein eigenes Grafikformat. Das kann man sich wie Paint vorstellen (nur in 3D). Man kann Punkte also mit der Maus platzieren. Dazu brauche ich natürlich die Mauskoordinaten relativ zur Zeichenfläche, kenne aber nur die Koordinaten relativ zur linken oberen Ecke im Fenster.

    Das hört sich danach an, als ob du dir dein Leben schwerer machst, als es eigentlich notwendig ist.
    Wenn deine Zeichenfläche irgendein Control ist dann kannst du dessen ScreenToClient und ClientToScreen Methoden benutzen, um die Mauskoordinaten umzurechnen.
    Wenn deine Zeichenfläche nur logisch existiert, dann nimmst du halt ScreenToClient und ClientToScreen des Parent und rechnest die Offsets rein.
    Am besten ist wohl, wenn du mal postest, was du gemacht hast.


Anmelden zum Antworten