Frame Hintergrund transparent darstellen
-
Hi, habe die Selber frage!
Ich will ein Frame das ich in eine Form eingefügt habe Transparent darstellen, sodass ich durch die Frame den Hintergrund meiner Form sehen kann nur das die Button der Frame alle Sichtbar sind.
Kann mir da jemand sagen wie das geht?
MfG
Jarhead_02
-
Das ist offenbar nicht ohne erhöhten Aufwand möglich.
Eine Alternative könnte TFormContainer von BilleniumSoft sein.
Eventuell lässt sich ja auch SetWindowRgn etc. auf TFrame anwenden. Vielleicht könnte man statt TFrame aber auch ein borderless TForm verwenden, das man über das Setzen von Parent auf die Hauptform legt.Alles ungetestet, nur kurz gegoogelt.
-
jarhead_02 schrieb:
Hi, habe die Selber frage!
Ich will ein Frame das ich in eine Form eingefügt habe Transparent darstellen, sodass ich durch die Frame den Hintergrund meiner Form sehen kann nur das die Button der Frame alle Sichtbar sind. Kann mir da jemand sagen wie das geht?
MfG Jarhead_02Hallo Jarhead,
das sollte gehen, kann aber wirklich fummelig sein, da man bei solchen Sachen schnell ein vererbtes Control schreiben muss, um die entsprechenden Funktionen überschreiben zu können. Den Frame transparent zu bekommen ist nicht das Problem. Das eigentliche Problem ist, das der Parent, also Dein Form seine Kinder clipped. Das Form kann also an den Stellen nichts zeichen, da die VCL im Paint DC diese Regionen sperrt. Du würdest also vermutlich an diesen Stellen den Desktop sehen. Ich hab leider gerade kein BCB6 installiert, aber schau Dir mal die Eigenschaft ControlStyle (?!) an. Dort konnte man glaube ich angeben, ob ein Control seinen Hintergrund selbst zeichnet oder nicht. Entsprechend eintscheidet der Parent, ob er den Bereich clippen soll oder nicht. Hilfreich kann sein, wenn Du die BCB/Delphi Enterprise Version hast, denn dort sind auch die Quellen der VCL dabei. So kann man sehen, wie die VCL das alles macht und in welche Funktionen man sich einklinken kann. Auch die vielen CM_xxx Botschaften, die die VCL an sich selbst schickt, bieten eine ganze Menge Möglichkeiten. Nur leider sind die meist nicht offiziell dokumentiert.
-
schonmal danke für die antworten.
Ich hatte es nur so hinbekommen das danach der Deskop durchgeschaut hat. (was natrürlich nicht erwünscht war)
Ich habe es jetzt mit einer PageControl gemacht. und die einzelnen Tabs ausgeblendet. Und jede Seite hat einfach ihren eigenen Hintergrund bekommen. Jetzt habe ich aber das Problem, dass Ich durch die PageControl einen Dickeren Rahmen bekommen habe den ich nicht haben möchte.
1.) Ist es Irgendwie möglich alle Rahmen (Form und PageControl) komplett verschwinden zu lassen, oder zumindest einen eigenen darüber zu legen?
2.) Und. gibt es einen üblicheren weg, Zwischen verschiedenen Seiten in einer Form zu wechseln?
MfG
jarhead_02
-
Du kannst einen TNotebook container verwenden der hat einen transparenten Hintergrund und hat keine Ränder.
-
Danke für die schnelle anwtort. Kann das TNotebook leider nicht finden, (kleinen Tip bitte)
Und da ich mir auch einen eigenen Rahmen erstellen möchte, wollte ich noch fragen ob es die möglichkeit gibt, 'Panels' zu verbinden, so das ein Rahmen entsteht. Oder ob man die Mitte eines 'Panels' ausschneiden kann?
MfG
jarhead_02
-
TNotebook befindet sich unter Win 3.1
Panels kann man nicht verbinden und auch kein Loch rein machen aber du kannst einen Rahmen nach deinen Wünschen per Canvas selbst zeichnen. zB außerhalb des TNotebook
-
Kann Canvas leider auch nicht finden.
Ist es denn Kompliziert damit zu arbeiten? hab das noch nie verwendet.
Irendwas worauf ich dabei achten muss?
(Überdeken die auch andere Panels?Danke für die schnelle Hilfe.
Jarhead_02
-
Was spricht gegen eine Bitmap in einer TImage mit einem Alphachannel.
(Weiß für transparente Bereiche und dann Transparenz anschalten)
Die Hintergrundfarbe der Form auf... MoneyGreen (irgendwas was nicht benutzt wird) und dann diese Farbe bei der Form unsichtbar machen.
Die Form bekommt am Schluss noch BorderStyle bsNone (oä) und schwupp die wupps hat man eine Custom Form mit Löchern und was einem einfällt.Ich find das gar nicht dämlich
Wie man sie dann noch verschiebt ist im FAQ zu finden.
-
hier mal ein kleines Beispiel, wie Du einen Frame Transparent bekommst. Auf diese Weise geht es aber nicht mehr, wenn DoubleBuffered auf true ist. Das ganze macht auch nur Sinn, wenn Dein Hintergrund ein Bild ist. Wenn er einfarbig ist, sez einfach ParentColor auf true.
Nur weil Du bei Transparenz den Hintergrund siehst, heißt das aber nicht, das Du hinter dem Frame liegende Controls bedienen könntest, es ist also nicht möglich "gemeinsame" Buttons in den Hintergrund zu setzen und nach Bedarf per Frames weitere Controls einzublenden.Vorgehen: CreateParams() und WM_ERASEBKGND Deines Frames überschreiben
class TMyFrame : public TFrame { protected: virtual void __fastcall CreateParams(Controls::TCreateParams &Params); virtual void __fastcall WMEraseBkgnd(Messages::TMessage &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_ERASEBKGND, TMessage, WMEraseBkgnd) END_MESSAGE_MAP(TWinControl); public: __fastcall TMyFrame(TComponent* Owner); }; /*----------------------------------------------------------*/ void __fastcall TMyFrame::CreateParams(Controls::TCreateParams &Params) { TFrame::CreateParams(Params); Params.ExStyle |= WS_EX_TRANSPARENT; } //--------------------------------------------------------------------------- void __fastcall TMyFrame::WMEraseBkgnd(Messages::TMessage &Message) { // nix machen, auch kein Dispatch, schliesslich wollen wir verhindern // das der Hintergrund durch die VCL gemalt wird }
Vielleicht hilft Dir das ja oder zeigt Dir zumindest mal wie man die VCL "verbiegen" kann. Mir hat das zumindest keine Ruhe gelassen, da mir dieser transparent Kram vor Jahren mal graue Haare beschert hat und ich sehen wollte ob noch irgendwas davon bis heute hängen geblieben ist
Iregndwie ernüchternd, gefühlt hab ich damals Nächte lang daran gesessen iregndwelche transparente Controls zu entwickeln und was bleibt ist ein 3-Zeiler ... wie immer