![]() |
TPanel transparent ?
Kann man ein TPanel transparent machen? In der [df][dp]PANEL und TRANSPARENT habe ich leider nichts finden können.
|
Re: TPanel transparent ?
Das versuche ich seit 3 Monaten. Mit einem normalen TPanel geht es nicht.
|
Re: TPanel transparent ?
Jain, richtig transparent bekommst du es nicht hinn. Annähernd transparent geht es so:
hier die komplette unit (weiß nimmer wo ich das her hab)
Delphi-Quellcode:
{ }
{ Copyright © 1998 by Mik Tran } { } { ****************************************************************** } unit utranspanel; interface uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls, Forms, Graphics, StdCtrls; type TTranPanel = class(TCustomcontrol) private Fborder : Boolean; Procedure Setborder(value : boolean); protected procedure Paint; override; public procedure CreateParams(var Params: TCreateParams); override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; published Property Border:Boolean read Fborder write Setborder; Property Visible; property Enabled; Property Align; property OnClick; property OnMouseDown; property OnMouseMove; property OnMouseUp; end; procedure Register; implementation procedure Register; begin RegisterComponents('DerReiterWosReinSoll', [TTranPanel]); end; procedure TTranPanel.CreateParams(var Params: TCreateParams); begin { call the create of the params } inherited CreateParams(Params); Params.ExStyle := Params.ExStyle + WS_EX_Transparent; ControlStyle := ControlStyle - [csOpaque] + [csAcceptsControls] end; constructor TTranPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); Width := 185; Height := 41; end; destructor TTranPanel.Destroy; begin inherited Destroy; end; procedure TTranPanel.Paint; begin If Fborder or (csDesigning in ComponentState) then begin Canvas.brush.color := clbtnshadow; Canvas .framerect(clientrect); end; end; Procedure TTranpanel.Setborder(value : boolean); begin if value <> Fborder then begin Fborder := value; invalidate; end; end; end. |
Re: TPanel transparent ?
Mit der Unit hab ich mich auch schon intensiv beschäftigt. Sobald du das Panel verschiebst, bekommst du ein Problem...
|
Re: TPanel transparent ?
ich weiß, deswegen hab ich ja auch geschrieben das es nur eine annähernde transparenz gibt
|
Re: TPanel transparent ?
Hallo!
Hoffe, es hilft Euch. Funktioniert einwandfrei.
Delphi-Quellcode:
Gruß,
unit TransparentPanel;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ExtCtrls; type TTransparentPanel = class(TCustomPanel) private { Private declarations } procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; protected { Protected declarations } Procedure Paint; override; Procedure CreateParams(var Params : TCreateParams); override; public { Public declarations } constructor Create(AComponent: TComponent);override; published { Published declarations } Property BevelInner; Property BevelOuter; Property Align; Property Caption; property OnClick; end; procedure Register; implementation procedure Register; begin RegisterComponents('Shamora', [TTransparentPanel]); end; constructor TTransparentPanel.Create(AComponent: TComponent); begin inherited; ControlStyle := ControlStyle - [csOpaque]; end; Procedure TTransparentPanel.Paint; var Rect: TRect; TopColor, BottomColor: TColor; const Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER); procedure AdjustColors(Bevel: TPanelBevel); begin TopColor := clBtnHighlight; if Bevel = bvLowered then TopColor := clBtnShadow; BottomColor := clBtnShadow; if Bevel = bvLowered then BottomColor := clBtnHighlight; end; begin Rect := GetClientRect; if BevelOuter < bvNone then begin AdjustColors(BevelOuter); Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); end; Frame3D(Canvas, Rect, Color, Color, BorderWidth); if BevelInner < bvNone then begin AdjustColors(BevelInner); Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); end; end; Procedure TTransparentPanel.CreateParams(var Params : TCreateParams); Begin inherited CreateParams(Params); With Params do begin ExStyle := ExStyle or WS_EX_TRANSPARENT; Style := Style and not WS_CLIPCHILDREN; Style := Style and not WS_CLIPSIBLINGS; end; End; procedure TTransparentPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd); begin Message.Result := -1; end; end. Shamora. |
Re: TPanel transparent ?
Wie ruft man das Ding auf. Bei mir geht es nicht.
|
Re: TPanel transparent ?
Liste der Anhänge anzeigen (Anzahl: 1)
da es eine Komponente ist, ist da nix mit aufrufen sonder du musst eine Instanz erstellen.
[Edit] So ganz 100% funktioniert das bei mir auch nicht. Ich habe einen Button auf mein Form gepackt, darüber dieses Panel und auf das Panel dann leicht versetzt einen zweiten button (so das der Button auf dem Panel einen Teil von Button 1 überdeckt). Beim ersten Klick auf Button2 (der auf dem Panel) erscheint Button1 während der Button2 gedrückt ist über Button2. [/Edit] [Edit2] Ich hab noch ein wenig probiert und das Problem herausgefunden. Sobald sich ein Control unter dem Panel neu zeischnet, zeischnet sich das Panel danach nicht neu. Wenn man also unter dem Panel einen Button hat und davon die Caption ändert dann malt sich der Button neu über die Controls die auf dem Panel legen (als würde der Button unter dem Panel über allem drüber liegen). Und wenn man einen Alphaeffekt erzielen will funktioniert das auch nur beim ersten mal denn beim Repaint des Panels wird der Untergrund nicht zuvor gemalt. Somit würde man bei 50% Transparenz beim nächsten Repaint die bereits geblendet Fläsche nocheinmal blenden (in meinem Beispiel hab ich mit Rot geblendet und somit wird das Rot immer intensiver bis man nicht mehr sieht was unter dem Panel ist.) [/Edit2] [Edit3] Ich hab mal das Beispielproject angehängt. In die Paint Methode des neuen Panels hab ich noch das Alphablend eingefügt um das ganze zu verdeutlichen
Delphi-Quellcode:
ZipDatei einfach entpacken und Projekt starten (compilieren).
LBitmap := TBitmap.Create;
LBitmap.Width := 1; LBitmap.Height := 1; LBitmap.Canvas.Pixels[0,0] := clRed; LBlendStruct.BlendOp := AC_SRC_OVER; LBlendStruct.BlendFlags := 0; LBlendStruct.SourceConstantAlpha := 127; LBlendStruct.AlphaFormat := 0; windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, LBitmap.Canvas.Handle, 0, 0, LBitmap.Width, LBitmap.Height, LBlendStruct); LBitmap.Free; [/Edit3] |
Re: TPanel transparent ?
Zitat:
Zitat:
|
Re: TPanel transparent ?
ähhm... eigentlich müsste man diese Komponente jetzt doch überall verwenden können oder?
Da muss ich sagen, dass das irgendwie nich so recht bei mir funzt... Als erstes gibts da ja nich alles was man so für nen Panel braucht und dann macht das auf dem Formular beim normalen erstellen totalen Mist... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz