Delphi-PRAXiS

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 18: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 19:01

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

SirThornberry 29. Jan 2005 19: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 19: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 19:17

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

Shamora 2. Jun 2005 17: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 08:22

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

SirThornberry 3. Jun 2005 08: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 10: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 19: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...

SirThornberry 18. Jun 2005 20:19

Re: TPanel transparent ?
 
wenn du schreibst "totaler misst" bringt das keinen Weiter. Eine exakte Fehlerbeschreibung wäre bedeutend hilfreicher um dir weiterhelfen zu können.
Aber davon abgesehen ist es bei Fenstern (also Controls mit Handel) nicht wirklich möglich eine transparenz zu erzielen die genau so funktioniert wie bei den Controls in Delphi. Unter anderem liegt das auch an Doublefuffered von Delphi zum anderen auch daran das sowas einfach nicht von windows her vorgesehen ist. Also bleibt als einzige Möglichkeit sich best möglichst an die Transparenz heranzuarbeiten.

turboPASCAL 18. Jun 2005 21:39

Re: TPanel transparent ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
ditto @ SirThornberry

Im Anhang noch eine Version, ein Mix aus den beiden weiter oben.

[Dumme Sache, die Caption will sich nicht vert. zentrieren lassen .?! :?] Behoben.

Marvel 19. Jun 2005 02:05

Re: TPanel transparent ?
 
das sieht mir irgendwie besser aus...
danke junge...

smart 19. Jun 2005 15:44

Re: TPanel transparent ?
 
Zitat:

Zitat von turboPASCAL
ditto @ SirThornberry

Im Anhang noch eine Version, ein Mix aus den beiden weiter oben.

[Dumme Sache, die Caption will sich nicht vert. zentrieren lassen .?! :?] Behoben.

Ist nicht schlecht, hat aber einen Schönheitsfehler, sobald das Panel bewegt wird, ist die Transparents weg!

turboPASCAL 19. Jun 2005 15:58

Re: TPanel transparent ?
 
:wiejetzt: Etwas genauer bitte, beim Erstellen oder in der .exe ?

smart 19. Jun 2005 16:03

Re: TPanel transparent ?
 
Nein, wenn man das Panel während der Laufzeit bewegt.

Z.B. so:
Delphi-Quellcode:
procedure TForm1.TrsPanel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  TTrsPanel (Sender).perform(WM_SysCommand, $F012, 0);
end;
Aber hast Dir trozdem viel Arbeit gemacht.

turboPASCAL 19. Jun 2005 16:10

Re: TPanel transparent ?
 
Aha, werde ma gucken.

Ne, viel Arbeit war es nich, habe ich nur aus meiner alten Komponentensammlung
herausgekramt und ge-updatet.

smart 19. Jun 2005 16:12

Re: TPanel transparent ?
 
Zitat:

Zitat von turboPASCAL
Aha, werde ma gucken.

Ne, viel Arbeit war es nich, habe ich nur aus meiner alten Komponentensammlung
herausgekramt und ge-updatet.

Trozdem, hast Du gut gemacht. Ist die bisher beste Lösung.

Heike.

Marvel 26. Jun 2005 12:41

Re: TPanel transparent ?
 
Ich muss noch anmerken, dasss andere Transparenzen irgendwie nich richtig übernommen werden.. Wenn ich also z.B. ein Image drauf hab, was nich vollständig mit dem Bild gefüllt ist, also noch ein transparenter Rand bleibt, dann wird der grau. Oder ein Label, was Transparent is, is da dann auch grau...

Wär schick, wenn das irgendwann richtig funzen sollte... erspaart einem ne Menge Arbeit wenn man mit Hintergrundbild oder so Arbeiten will....

turboPASCAL 17. Jul 2005 14:21

Re: TPanel transparent ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nachtrag zum Transparent Panel weiter oben.


Habe eine neue Variante erstellt, bei dem der Hintergrund von einem Bitmap gezeichnet wird.

Diese Version behebt den Fehler mit den darunter liegenden Images (auch beim verschieben).

Nachteil: Unter den Panel liegende Controls wie Buttons oder andere Panels usw. werden nicht gezeichnet.

taktaky 30. Sep 2007 11:27

Re: TPanel transparent ?
 
.dpr fehlt

Ich möchte nur das Panel transparent machen

Kann jemand mir helfen?


---------

DeddyH 30. Sep 2007 11:31

Re: TPanel transparent ?
 
Hast Du die Komponente installiert?

taktaky 30. Sep 2007 12:03

Re: TPanel transparent ?
 
Ich habe den Code in ein neues Project, dann die visuale Objekte erstellt
Delphi-Quellcode:
unit TransparentPanel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm);
  TTransparentPanel = class(TCustomPanel)
    TransparentPanel: TPanel;
    Bevel: TBevel;

  private
  procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
  protected
    { Protected declarations }
  Procedure Paint; override;
  Procedure CreateParams(var Params : TCreateParams); override;
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AComponent: TComponent);override;
  published
    { Published declarations }
    Property BevelInner;
    Property BevelOuter;
    Property Align;
    Property Caption;
    property OnClick;
  end;

var
  Form1: TForm1;

  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;

{$R *.dfm}

end.
Ich bekomme ich die Meldung:
EclassNotFound with Message Class TBevel not found

Objekte in meinem Form :
Delphi-Quellcode:
object Form1: TForm1
  Left = 221
  Top = 115
  Width = 615
  Height = 587
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Bevel: TBevel
    Left = 20
    Top = 20
    Width = 461
    Height = 441
  end
  object Panel: TPanel
    Left = 40
    Top = 40
    Width = 421
    Height = 401
    Caption = 'Panel'
    TabOrder = 0
  end
end


________

taktaky 30. Sep 2007 12:32

Re: TPanel transparent ?
 
Zitat:

Zitat von DeddyH
Hast Du die Komponente installiert?

Gibt es keine andere Möglichkeit um ein Panel transparent zu machen ohne die Komponenten installieren zu müssen?

---------

DeddyH 30. Sep 2007 12:51

Re: TPanel transparent ?
 
Gewöhn Dir endlich ab, Quelltexte per C&P irgendwo in Deinen Sourcen einzufügen. Wenn Du die Komponente nicht installieren willst, speichere deren Source wenigstens irgendwo im Suchpfad ab und binde sie dynamisch ein. Wie das geht, sollte über die SuFu zu finden sein.

taktaky 30. Sep 2007 13:38

Re: TPanel transparent ?
 
Ist die Componente nicht free !!!
Delphi-Quellcode:
{*****************************************************************************}
{                                                                             }
{                         Transparent Panel Componente                       }
{                         Copyright © 1998 by Mik Tran                       }
{                             Edit by Matti - D6pe                           }
{                                                                             }
{*****************************************************************************}

-----------

DeddyH 30. Sep 2007 13:39

Re: TPanel transparent ?
 
Wie kommst Du jetzt darauf?

taktaky 30. Sep 2007 14:16

Re: TPanel transparent ?
 
Zitat:

Zitat von DeddyH
Wie kommst Du jetzt darauf?

ich habe was gefunden aber wieder nicht free !!!
http://www.delphi32.com/vcl/5610/

DeddyH 30. Sep 2007 14:20

Re: TPanel transparent ?
 
Und was stört Dich an der o.a. Komponente?

taktaky 30. Sep 2007 14:46

Re: TPanel transparent ?
 
Zitat:

Zitat von DeddyH
Und was stört Dich an der o.a. Komponente?

Weil sie nicht free sind

Hier habe ich noch ein Transparentes Panel gefunden, diesmal ist free.
http://www.delphi32.com/vcl/1208/download,xid,1208.asp
Das Form kann ich aber nicht öffnen!

DeddyH 30. Sep 2007 14:55

Re: TPanel transparent ?
 
Zitat:

Zitat von taktaky
Weil sie nicht free sind

Wo stand denn das? Bloß, weil ein Copyright-Hinweis drin ist, heißt das doch nicht, dass Du sie nicht verwenden darfst. Wäre ja auch ein bisschen dämlich, eine Shareware-Kompo im Quelltext zu veröffentlichen, oder? :zwinker:
Zur Not frag doch mal den Autor.

[edit]Die Kompo ist vom selben Autor, da steht auch derselbe Copyright-Hinweis drin[/edit]

taktaky 22. Okt 2007 11:47

Re: TPanel transparent ?
 
Wie installiere ich die Package TrsPanels.dpk ?
jedes mal bekomme ich einen enden error !

Vielleicht da ich vorher falsch installiert habe

Das ist das beste Demo, was ich hier in DP gefunden habe.

inherited 25. Okt 2007 01:23

Re: TPanel transparent ?
 
Zitat:

Zitat von taktaky
jedes mal bekomme ich einen enden error !

enden???

taktaky 25. Okt 2007 18:27

Re: TPanel transparent ?
 
Zitat:

Zitat von inherited

enden???

Leider ist meine Tastatur ist per Funk. Einige Buchstaben gehen in die Luft verloren :mrgreen:

DeddyH 25. Okt 2007 19:18

Re: TPanel transparent ?
 
Und was hat das mit dem Package zu tun? :gruebel:

Pichel 5. Mai 2008 15:17

Re: TPanel transparent ?
 
Zitat:

Zitat von taktaky
Gibt es keine andere Möglichkeit um ein Panel transparent zu machen ohne die Komponenten installieren zu müssen?

Dieser Thread ist ja eigentlich schon rum, trotzdem hab ich noch ne kleine Idee.

Wenn es nur um die Panels in einem Projekt geht kannst Du auch einfach das Paint umleiten:

Delphi-Quellcode:
type
  TMyPanel = ExtCtrls.TPanel;
  TPanel = class(TMyPanel)
  private
    procedure Paint; override;
  end;

procedure TPanel.Paint;
begin
  inherited; // Standard Paint ;-)
  with Canvas do begin
    // hier kannst Du nach Herzenswunsch rummahlen ;-)
  end;
end;
Damit sind "alle" Panels nun betroffen.
Wenn es nun transparent sein soll einfach den Hintergrund "reinpinseln"


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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