Darstellungsebene von dynamisch erstellten Komponenten verändern
-
Hallo Leute,
Eigentlich programmiere ich mit dem C++ Builder. In dem dortigen Forum konnte man mir jedoch leider nicht helfen und daher frage ich hier, ob es für meine Frage eine allgemeine Antwort für C++ gibt: Wie kann ich die Darstellungsebene einer Komponente verändern? Im C++ Builder gibt es die Methoden BringToFront() und SendToBack(). Ich möchte jedoch dynamisch erstellte Komponenten nicht komplett in den Hintergrund oder Vordergrund stellen, sondern die Komponente einfach eine Ebene nach vorne/ hinten bringen. Kennt von euch vielleicht jemand eine Lösung für meine Probleme?
Vielen Dank für eure Hilfe,
Euer Entertainer
-
Wenn du mit Darstellungsebene die 'Z-Koordinate' von Steuerelementen meinst, dann könnte dir vielleicht die Funktion SetWindowPos() weiterhelfen.
PS.: Kann sein, dass ich überhaupt nicht verstanden habe was dein Problem ist

-
Vielleicht hast du recht und meine Ausführungen sind schlecht verständlich.
Ich probiers mit einem Beispiel auszudrücken:
Wenn ich vier Buttons dynamisch erstelle und sich die Buttons mit ihren Ecken überlappen, dann ist der Button, dessen Ecke sichtbar ist, eine Ebene über den darunterliegenden Buttons. Nun möchte ich dies ändern und beispielsweise die Ecke des Buttons direkt unter dem obersten sehen. Ich möchte den jetzt noch oben liegenden Button aber nicht komplett in den Hintergrund schicken, sondern einfach eine Ebene nach unten, also eine Ebene unter die Ebene des darunterliegenden Buttons.Ich weiß, dass dies auch etwas kompliziert ausgedrückt ist, aber ich hoffe mit meinem ersten Bericht ist mein Problem nun etwas einleuchtender.
Vielen Dank für eure Hilfe,
Euer Entertainer
-
Ok, dann geht's doch eigentlich eh um die Geschichte mit der Z-Koordinate (oder besser gesagt Z-Ebene).
Hier eine kleine Illustration:
|---------| |Btnx|---------| |----| Button2 | | |--------| |-----| Btn 3 | |--------|Du möchtest nun per Funktionsaufruf bewirken, dass z.B. "Btn 3" um eine Ebene in den Hintergrund geschoben wird. Nützlich wäre natürlich auch eine Funktion, die ein Element um eine Ebene hinauf verschieben würde. Du sagtest, dass dich der C++ Builder insofern einschränkt, dass er dir nur erlaubt Elemente in die höchste bzw. in die tiefste Ebene zu verschieben (BringToFront() und SendToBack()).
Ok, soweit so gut; ich schätze ich hab dich schon richtig verstanden.
Um diese Problematik elegant zu lösen würde ich eine Klasse implementieren, die für mich die Funktionalität von SetWindowPos() kapseln würde. Mit SetWindowPos kann man nämlich die Z-Ebene eines Steuerelementes kontrollieren (zumindest entnehme ich das theoretischhalber der Dokumentation; (Parameter: insterAfter)).
Konkret würde ich der Klasse einfach einen vector als Attribut verpassen, der die Fensterhandles als Elemente speichern soll. Folgende Methoden müsstest du implementieren:Eine Methode,
.) die den vector in der Klasse setzt (Klasse::SetVector(const vector<HWND> &vc)).
.) die ein Index (oder vll. auch ein HWND) annimmt und das Element im vector um eine Stelle hinauf -bzw. hinunterschiebt (bool Klasse::MoveUp(HWND/INT), bool Klasse::MoveDown(HWND/INT)).
.) die durch den vector iteriert und die API-Funktion SetWindowPos aufruft (also die eigentlich wesentliche Operation durchführt)(Klasse::Update()).Alles klar?

PS.: Ich (und bestimmt auch andere) würde mich freuen wenn du den Code posten würdest wenn du die Klasse implementiert hast. Falls du Hilfe dabei brauchst, dann kannst du hier den Zwischenstand posten...
-
Hallo Aziz,
Mit Vektoren kenne ich mich leider noch nicht so gut aus, aber ich habe mich einmal über SetWindowPos(...) schlau gemacht.
Deine Antwort war sehr hilfreich und man kann so die z-Koordinate verändern:
SetWindowPos(Button3->Handle, Button2->Handle, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);Kurze Erläuterung:
Button3->Handle ist der Handle zu der Komponente, deren Ebene ich verändern möchte.
Button2->Handle ist der Handle zu der Komponente, die von der Ebene her über der zu verändernden Komponente stehen soll. Das heißt, wenn ich beispielsweise 3 Buttons habe und Button1 ganz unten, Button2 in der Mitte und Button3 ganz oben liegt und die Funktion wie oben beschrieben ausführe, steht nach der Ausführung der Button3 in der Mitte und Button2 dahinter, also ganz oben. Würde man statt Button2->Handle Button1->Handle schreiben, würde Button3 zum unterseten Button, Button1 zum mittleren und Button2 zum oberen.Vielen Dank für deine Hilfe,
Entertainer
-
Gern geschehen.