M
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