![]() |
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... |
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. |
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. |
Re: TPanel transparent ?
das sieht mir irgendwie besser aus...
danke junge... |
Re: TPanel transparent ?
Zitat:
|
Re: TPanel transparent ?
:wiejetzt: Etwas genauer bitte, beim Erstellen oder in der .exe ?
|
Re: TPanel transparent ?
Nein, wenn man das Panel während der Laufzeit bewegt.
Z.B. so:
Delphi-Quellcode:
Aber hast Dir trozdem viel Arbeit gemacht.
procedure TForm1.TrsPanel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; TTrsPanel (Sender).perform(WM_SysCommand, $F012, 0); end; |
Re: TPanel transparent ?
Aha, werde ma gucken.
Ne, viel Arbeit war es nich, habe ich nur aus meiner alten Komponentensammlung herausgekramt und ge-updatet. |
Re: TPanel transparent ?
Zitat:
Heike. |
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.... |
Re: TPanel transparent ?
Liste der Anhänge anzeigen (Anzahl: 1)
Nachtrag zum
![]() 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. |
Re: TPanel transparent ?
.dpr fehlt
Ich möchte nur das Panel transparent machen Kann jemand mir helfen? --------- |
Re: TPanel transparent ?
Hast Du die Komponente installiert?
|
Re: TPanel transparent ?
Ich habe den Code in ein neues Project, dann die visuale Objekte erstellt
Delphi-Quellcode:
Ich bekomme ich die Meldung:
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. 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 ________ |
Re: TPanel transparent ?
Zitat:
--------- |
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.
|
Re: TPanel transparent ?
Ist die Componente nicht free !!!
Delphi-Quellcode:
{*****************************************************************************}
{ } { Transparent Panel Componente } { Copyright © 1998 by Mik Tran } { Edit by Matti - D6pe } { } {*****************************************************************************} ----------- |
Re: TPanel transparent ?
Wie kommst Du jetzt darauf?
|
Re: TPanel transparent ?
Zitat:
![]() |
Re: TPanel transparent ?
Und was stört Dich an der o.a. Komponente?
|
Re: TPanel transparent ?
Zitat:
Hier habe ich noch ein Transparentes Panel gefunden, diesmal ist free. ![]() Das Form kann ich aber nicht öffnen! |
Re: TPanel transparent ?
Zitat:
Zur Not frag doch mal den Autor. [edit]Die Kompo ist vom selben Autor, da steht auch derselbe Copyright-Hinweis drin[/edit] |
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. |
Re: TPanel transparent ?
Zitat:
|
Re: TPanel transparent ?
Zitat:
|
Re: TPanel transparent ?
Und was hat das mit dem Package zu tun? :gruebel:
|
Re: TPanel transparent ?
Zitat:
Wenn es nur um die Panels in einem Projekt geht kannst Du auch einfach das Paint umleiten:
Delphi-Quellcode:
Damit sind "alle" Panels nun betroffen.
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; 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