Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TPanel transparent ? (https://www.delphipraxis.net/39165-tpanel-transparent.html)

smart 29. Jan 2005 17:53


TPanel transparent ?
 
Kann man ein TPanel transparent machen? In der [df][dp]PANEL und TRANSPARENT habe ich leider nichts finden können.

Elite 29. Jan 2005 18:01

Re: TPanel transparent ?
 
Das versuche ich seit 3 Monaten. Mit einem normalen TPanel geht es nicht.

SirThornberry 29. Jan 2005 18:06

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.

Elite 29. Jan 2005 18:14

Re: TPanel transparent ?
 
Mit der Unit hab ich mich auch schon intensiv beschäftigt. Sobald du das Panel verschiebst, bekommst du ein Problem...

SirThornberry 29. Jan 2005 18:17

Re: TPanel transparent ?
 
ich weiß, deswegen hab ich ja auch geschrieben das es nur eine annähernde transparenz gibt

Shamora 2. Jun 2005 16:40

Re: TPanel transparent ?
 
Hallo!
Hoffe, es hilft Euch. Funktioniert einwandfrei.

Delphi-Quellcode:
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.
Gruß,
Shamora.

smart 3. Jun 2005 07:22

Re: TPanel transparent ?
 
Wie ruft man das Ding auf. Bei mir geht es nicht.

SirThornberry 3. Jun 2005 07:35

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:
  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;
ZipDatei einfach entpacken und Projekt starten (compilieren).
[/Edit3]

Shamora 3. Jun 2005 09:06

Re: TPanel transparent ?
 
Zitat:

Zitat von SirThornberry
da es eine Komponente ist, ist da nix mit aufrufen sonder du musst eine Instanz erstellen.
Beim ersten Klick auf Button2 (der auf dem Panel) erscheint Button1 während der Button2 gedrückt ist über Button2.

Tatsächlich. Ist mir nie aufgefallen, da ich das Panel nur als ein ‚lock’- Panel benutzt und für solche 'lock' - Zwecke geschrieben habe… Muss man noch nachhacken.

Zitat:

Zitat von SirThornberry
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.)

Für einen Alphaeffekt ist das Panel auch nicht gedacht. Das Panel zeichnet sich wirklich nicht neu (WMEraseBkgnd). Die Komponente ist transparent, also logisch gesehen, hat nicht zu zeichnen. Um einen Alphaeffekt zu erzielen, muss man anders schreiben….

Marvel 18. Jun 2005 18:32

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 07:03 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz