Entwickler-Ecke
Windows API - Komponenten verschieben - keine Fenster
daPimP - Mo 07.06.04 21:52
Titel: Komponenten verschieben - keine Fenster
N.Abend!
Also ich frage NICHT wie ich fremde Fenster per Handle verschieben kann
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var P:trect; begin GetWindowRect(HandleDesFensters, P);
MoveWindow(HandleDesFensters, left, top, width, height, true); end; |
SONDERN ich will einzelne Komponenten deren Handle ich kenne, in Größe und Position verändern!
Das würde ja schon mit diesem Quellcode klappen, aber
GetWindowRect geht ja immer von der oberen Ecke (0,0) aus, während ich im Prinzip die obere Ecke des Fenster bräuchte auf der die Komponente sitzt.
Verstanden? :wink:
Denn wenn ich Komponenten wie oben beschrieben verschiebe, liegen die ausserhalb des sichtbaren Fensters!
Bsp: Wenn ich die Angabe auslese: TButton ist 100 top, 200 left
(zur oberen Ecke des Fensters)
und ich ihn erneut auf 100 top, 200 left
( zur oberen Screenecke setze, geht das ja schief)
ideas :?:
MartinPb - Mo 07.06.04 22:08
Fenster ist unter Windows nicht nur das Fenster, sondern fast alles. Auch ein Button ist ein Fenster. Betrachte das aus dieser Sicht.
daPimP - Mo 07.06.04 22:28
:evil: Grrr :evil:
Also des war ja nu ein bisschen überflüssig!
Nehmen wir an, ich verwende die oben angegebene Möglichkeit, dann brauch ich die Möglichkeit von einer Komponente meiner Wahl auf das TOPWINDOW (also ein Fenster im eigentlichen Sinne mit minimieren und maximieren!!! :? ) zuzugreifen um diese Position auszulesen und dann
nach dem Motto
Position Komponente - Position Fenster = gesuchte Position
jaenicke - Di 08.06.04 12:54
Wie wärs mit ScreenToClient und ClientToScreen?
(Umwandlung von Screen-Koordinaten in Fenster-Koordinaten und umgekehrt...)
MartinPb - Di 08.06.04 13:31
jaenicke hat folgendes geschrieben: |
Wie wärs mit ScreenToClient und ClientToScreen?
(Umwandlung von Screen-Koordinaten in Fenster-Koordinaten und umgekehrt...) |
Er arbeitet mit fremden Fenstern, also mit API. Aber so schwer ist es denoch nicht. Wie ich schon oben geschreiben habe ist alles unter Windows ein Fenster. Man muß also nur die Positionen zweier Fenster bestimmen; des Hauptfensters und des Childfensters. Dann addiert man zu dem Childfenster die Koordinate des Hauptfensters und schon hat man das gesuchte Ergebnis. Aber was sagte daPimP auf den Tip?
daPimP hat folgendes geschrieben: |
:evil: Grrr :evil:
Also des war ja nu ein bisschen überflüssig! |
Anscheinend will er einen fertigen Quelltext :roll: .
Motzi - Di 08.06.04 13:39
Es gibt auch API-Funktionen die genau dasselbe machen wie ScreenToClient und ClientToScreen .. (wenn ich mich recht erinnere heißen die sogar fast genauso). Kann jetzt aber leider nicht nachschaun, da ich auf der Uni bin..
daPimP - Di 08.06.04 18:26
@MartinPb
Zitat: |
Aber was sagte daPimP auf den Tip? |
Was ich damit sagen wollte ist, dass mir das nix bringt. Ich bin nicht DER Quellcodehascher, das wirst du spätestens im Sommer sehn, wenn dir mein kleines Tool über den Weg läuft. Aber bis dahin is noch ein bisserl Arbeit nötig.... 8)
Zum wesentlichen :wink:
1: Ist es möglich von einer
"Komponente" auf das
"Fenster" zu schließen?
ANTWORT 1: Ja, aber WIE ???
2: Ich lese die Koordinaten einer Komponente aus und erhalte den Abstand von der oberen ScreenEcke
des Desktops bis zu meiner Komponente.
Nun änder ich die Position der Komponente mit
MoveWindow.
Soweit sollte es klar sein, was ich meine.
MoveWindow ist korrekt!
Was ich nicht gebacken bekomme, sind die korrekten Positionsdaten anzugeben.
Breite und Höhe der Komponente ist ebenfalls korrekt. :P
:idea:
Le big problèm :idea: sind die Seiten- und Höhenangaben der Komponente zum
"Fenster", da ich wie gesagt, nur die Seiten- und Höhenangaben der Komponente zum
"Nullpunkt des Desktops" habe!
Vorschläge weiterhin erwünscht!
daPimP - Di 08.06.04 19:09
im speziellen geht diese FRAGE an Motzi 8)
Mein Problem hast du in deinem Prog X-Spy ja auch gelöst.
Ich suche mit der Maus die Komponente und lass mir über Properties alle Infos anzeigen!
Rectangle: ...
Restored Rect: ...
Client Rect: ...
Im speziellen benötige ich den ersten Klammerwert von Rectangle (schätze du ließt das "Fenster" aus, wo die "Komponente" drauf sitzt.)
Ne Hilfe dazu wär nett. :roll: Vielleicht erst mal, wie die Funktionen heißen?
MartinPb - Di 08.06.04 19:31
daPimP hat folgendes geschrieben: |
1: Ist es möglich von einer "Komponente" auf das "Fenster" zu schließen?
ANTWORT 1: Ja, aber WIE ??? |
GetParent
daPimP - Di 08.06.04 20:18
An diese func hab ich auch schon gedacht.
Aber es gibt mir ja nur das Handle von der Komponente die "drunterliegt".
Also müsste ich solange GetParent(GetParent(GetParent(UrHandle))) abfangen, bis ich auf das "Fenster" komme. Woher aber nun weiß ich, was das "Fenster" ist?
( Also das Formular, wenn de so willst) :wink:
MartinPb - Di 08.06.04 20:57
GetParent in Delphi eingeben und F1 drücken. Da steht, daß ein Hauptfenster den Wert NULL (0) zurückgibt. Also GetParent in eine While Schleife setzten und ausführen bis die 0 kommt. Ist doch nicht schwer.
Motzi - Di 08.06.04 21:52
Prinzipiell.. gehts hier um Komponenten oder allgemein um Fenster? Prinzipiell muss man immer zwischen VCL-Methoden und API-Funktionen unterscheiden und gerade in diesem Bereich existieren viele Funktionen mit gleichem Namen.
Die API bietet dieselben Möglichkeiten wie die VCL (komisch, schließlich baut die VCL auch nur auf diesen APIs auf.. ;)). Ich verwende in meinem X-Spy nur GetWindowRect, aber man kann diese Koordinaten auch noch mit der API-Funktion ScreenToClient umrechnen:
PSDK hat folgendes geschrieben: |
The ScreenToClient function converts the screen coordinates of a specified point on the screen to client-area coordinates.
Quelltext 1: 2: 3: 4:
| BOOL ScreenToClient( HWND hWnd, // handle to window LPPOINT lpPoint // screen coordinates ); |
The function uses the window identified by the hWnd parameter and the screen coordinates given in the POINT structure to compute client coordinates. It then replaces the screen coordinates with the client coordinates. The new coordinates are relative to the upper-left corner of the specified window's client area. |
daPimP - Di 08.06.04 22:20
Ich dank euch fürs erste.
Werd das morgen mal umsetzten und dann einen LösungsCode reinstellen.
Vielleicht ist ja noch so jemand im Netz unterwegs, der gerne Fenster und Komponenten verschiebt!!
:wink: :wink: :wink: :wink: :wink: :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!