Laden...

Koordinaten-Umrechnung

Erstellt von dirkil vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.321 Views
D
dirkil Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren
Koordinaten-Umrechnung

Ich habe mit GetWindowRect des Rechteck eines Buttons in einem Fenster ermittelt. Dieses hat allerdings Screen Koordinaten. Ich würde aber lieber die relativen Koordinaten des Buttons innerhalb des Fensters haben, in dem es sich befindet.

Gibt es dafür eine Routine oder muß ich auch noch das Rect des Parents ermitteln und dann die Differenzen bilden?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo dirkil,

Control.PointToClient
Control.PointToScreen

herbivore

D
dirkil Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

@herbivore

Hm, I am not sure if I understood how to use it. I didn't mention that the control is in a window of another process. I use EnumChildWindows to iterate over the controls.

My Callback is like that:

public bool WindowEnumProc(IntPtr hwnd, int lParam)
        {
            
            // get the text from the window
            StringBuilder bld = new StringBuilder(256);
            GetWindowText(hwnd, bld, 256);
            string text = bld.ToString();

            if (text == "Btn")
            {
                RECT rect = new RECT();
                GetWindowRect(hwnd, out rect);
                 
                Console.WriteLine(string.Format("Left={0}, Top={1}, width={2}, height={3}", rect.Left, rect.Top, rect.Right-rect.Left, rect.Bottom-rect.Top));
                
            }
            return true;
        }

I think I can't use Control.PointToClient() because I only have an handle to the window. Or am I overlooking something?

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo dirkil,

nun in Englisch? Also nicht böse sein, da das absichtlich ein deutschsprachiges Forum ist, werde ich meine Antwort auf Deutsch geben 🙂

Wenn Du nur das Handle auf das Fenster hast, wird Dir nichts anderes übrig bleiben, als die Koordinaten des Fensters zu ermitteln, und dann eine Differenz zu dem Button selbst zu errechnen.

Das ist aber nun wirklich nicht schwer. 2 Zeilen Code mit 2 Einzelanweisungen 😉


int iRelativeXPos = iButtonXPos - iWindowXPos;
int iRelativeYPos = iButtonYPos - iWindowYPos;

Das wird eine Routine auch nicht anders oder einfacher machen können 😉

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

D
dirkil Themenstarter:in
23 Beiträge seit 2006
vor 17 Jahren

@Norman

Da sieht mn mal, daß ich völlig überarbeitet bin. Jetzt schreibe ich schon in Englisch in diesem Forum...

Ok, alles klar, ich wollte nur sichergehen, daß ich nichts übersehe. Vielen Dank für die Antworten.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo dirkil,

du hast was übersehen. 🙂 Die entsprechenden Win32-Funktionen heißen:

ScreenToClient
ClientToScreen

Würde ich auch immer vorziehen, denn die Zeilen von norman_timo funktionieren nur, wenn die Parent-Client-Hierarchie einstufig ist, was sie in vielen Fällen (GroupBox, Panel, ...) nicht ist.

herbivore

PS: in Microsoft Win32 to Microsoft .NET Framework API Map findet sich eine lange Liste von korrespondierenden .NET-Methoden und Win32-Funktionen.

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo Herbivore,

Würde ich auch immer vorziehen, denn die Zeilen von norman_timo funktionieren nur, wenn die Parent-Client-Hierarchie einstufig ist, was sie in vielen Fällen (GroupBox, Panel, ...) nicht ist.

Da hast Du Recht.

Ich hab da auch nicht weit genug gedacht.

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”