Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Koordinaten-Umrechnung
dirkil
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

Koordinaten-Umrechnung

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo dirkil,

Control.PointToClient
Control.PointToScreen

herbivore
private Nachricht | Beiträge des Benutzers
dirkil
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

@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?
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
dirkil
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo Herbivore,
Zitat
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!”
private Nachricht | Beiträge des Benutzers