Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Label unabhänig von der form "alpha blenden" (https://www.delphipraxis.net/43333-label-unabhaenig-von-der-form-alpha-blenden.html)

NikoMitDaMacht 1. Apr 2005 22:01


Label unabhänig von der form "alpha blenden"
 
Hi!

Gibt es eine Möglichkeit ein Label langsam transparent zu machen ohne dass die ganze form mit transparent wird??
(Ich mein AlphaBlend nicht ganz Transparent :wink: )

[edit]Immer diese blöden Tippfehler![/edit]

Radioactive 16. Apr 2005 08:06

Re: Label unabhänig von der form "alpha blenden"
 
So viel ich weiß, kann man nur die ganze Form "Alphablenden".
Du könntest aber die Schriftfarbe immer mehr dem Hintergrund anpassen. Das kannst du entweder mit einer for-Schleife machen und sleep(10) einfügen oder du benutzt einen Timer. Das ist dann aber nur ein Fake-Alphablend.

jfheins 16. Apr 2005 08:39

Re: Label unabhänig von der form "alpha blenden"
 
So ins Blaue getippt.

Wenn man das Form Alpha-Blenden kann, müsste es doch eigentlich mit jedem TWibnControl gehen - und dann auch mit TStaticText (nicht mit TLabel, das TLabel nicht von TWinControl abstammt) gehen, oder :gruebel:

SirThornberry 16. Apr 2005 08:55

Re: Label unabhänig von der form "alpha blenden"
 
@fjeins: dein ins blaue geratene ist falsch. wenn man alphablend von xp-einsetzt so werden alle childs des wincontrols mit alphageblendet.

Allerdings ist es mit etwas/wenig arbeit möglich ein Label alphazublenden. du musst einfach nur das Paint überschreiben und dann selbst den Untergrund mit der Schrift die darauf soll blenden.

SirThornberry 16. Apr 2005 09:14

Re: Label unabhänig von der form "alpha blenden"
 
So, hab mal schnell sowas nachgebaut (hab bewusst nicht den alten Beitrag editiert weil sonst niemand mitbekommt das etwas entscheidentes dazu gekommen ist)

So wirds verwendet:
- Den Source als "uAlphaLabel.pas" abspeichern.
- Wie gewohnt einfach normale Labels auf dem Form plazieren
- In die Uses des Forms wo die Labels drauf sind "uAlphaLabel" aufnehmen, dabei darauf achten das in den uses "uAlphaLabel" hinter "StdCtrls" steht.
- dadurch wird jetzt jedes Label welches sich auf dem Form befindet zu einem "alphalabel", dementsprechend können wir auch im Constructor den Alphawert setzen (Label1.Alphaval := 127)

Standard Alphawert des Alphalabels ist 255 damit nicht Labels die eigentlich keine Transparenz haben sollen plözlich transparent sind.

Natürlich kann man auch einfach die Klasse umbenennen und als eigene Komponente registrieren.
Delphi-Quellcode:
unit uAlphaLabel;

interface

uses
  windows, graphics, classes, StdCtrls;

type
  TLabel = class(StdCtrls.TLabel)
  private
    fAlphaVal: Byte;
    procedure FSetAlphaVal(AAlpha: Byte);
  public
    constructor Create(AOwner: TComponent); override;
    procedure Paint; override;
  published
    property AlphaVal: Byte read fAlphaVal write FSetAlphaVal default 255;
  end;

implementation

constructor TLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Transparent := True;
  fAlphaVal := 255;
end;

procedure TLabel.Paint;
type
  PCanvas = ^TCanvas;
var LBitmap: TBitmap;
    LOldCanvas: TCanvas;
    LBlendFunc: TBlendFunction;
begin
  if fAlphaVal = 255 then
    inherited Paint
  else begin
    LBitmap := TBitmap.Create;
    LBitmap.Width := Width;
    LBitmap.Height := Height;
    BitBlt(LBitmap.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
    LOldCanvas := Canvas;
    PCanvas(@Canvas)^ := LBitmap.Canvas;
    inherited Paint;
    PCanvas(@Canvas)^ := LOldCanvas;
    LBlendFunc.BlendOp := AC_SRC_OVER;
    LBlendFunc.BlendFlags := 0;
    LBlendFunc.SourceConstantAlpha := fAlphaVal;
    LBlendFunc.AlphaFormat := 0;
    windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, LBitmap.Canvas.Handle,
                       0, 0, Width, Height, LBlendFunc);
    LBitmap.Free;
  end;
end;

procedure TLabel.FSetAlphaVal(AAlpha: Byte);
begin
  if AAlpha <> fAlphaVal then
  begin
    fAlphaVal := AAlpha;
    Repaint;
  end;
end;

end.

Balu der Bär 27. Jun 2006 13:25

Re: Label unabhänig von der form "alpha blenden"
 
An dieser Stelle mal ein dickes Dankeschön an SirThornberry, du hast mir damit viel Arbeit erspart. :-)

Jetzt wäre es nur noch besser wenn man die AlphaBlend-Stärke zur Laufzeit ändern könnte.

//Edit2: Möglichkeit gefunden, is doch alles da. :wall:

:-)

padavan 23. Okt 2006 06:28

Re: Label unabhänig von der form "alpha blenden"
 
Guten Morgen,

hab die Lösung von SirThornberry auch ausprobiert, klappt prima!

Da muss man ja glatt auch die Idee kommen, das auch für andere Komponenten anzuwenden.
Aber da hakts dann auch gleich an der Listview.

Wollte das folgendermaßen umbauen:

Delphi-Quellcode:
unit uAlphaLabel; // naja, der Name soll erstmal nicht das Problem sein....

interface

uses
  windows, graphics, classes, StdCtrls, ComCtrls; // <-- Änderung

type
  TListview = class(ComCtrls.Tlistview)   // <-- Änderung
  private
    fAlphaVal: Byte;
    procedure FSetAlphaVal(AAlpha: Byte);
  public
    constructor Create(AOwner: TComponent); override;
    procedure Paint; override;                        // <-- hier hängt´s
  published
    property AlphaVal: Byte read fAlphaVal write FSetAlphaVal default 255;
  end;

Bei
Delphi-Quellcode:
procedure Paint; override;
hängt´s, weil die Methode Paint nicht in der Basisklasse existiert, sagt der Compiler.
Was ich jetzt nicht verstehe, die Komponente muss doch auch irgendwie gezeichnet werden ?!

Hat jemand ne Idee,
wäre doch echt toll, wenn man das bei ner Listview auch anwenden könnte....

Gruß
Padavan

xaromz 23. Okt 2006 08:58

Re: Label unabhänig von der form "alpha blenden"
 
Hallo,
Zitat:

Zitat von padavan
Was ich jetzt nicht verstehe, die Komponente muss doch auch irgendwie gezeichnet werden ?!

der Unterschied zwischen TLabel und TListVeiew ist, dass ein TLabel ein TGraphicControl ist, während TListView ein TWinControl ist.
Ein TWinControl ist ein Steuerelement, welches von Windows gezeichnet wird. Deshalb hat es keine Paint-Methode.

Gruß
xaromz

padavan 23. Okt 2006 10:10

Re: Label unabhänig von der form "alpha blenden"
 
Lese ich dann richtig zwischen den Zeilen, dass es dann Schwierig wird, diese Vorgehensweise zu adaptieren?

xaromz 23. Okt 2006 10:16

Re: Label unabhänig von der form "alpha blenden"
 
Hallo,
Zitat:

Zitat von padavan
Lese ich dann richtig zwischen den Zeilen, dass es dann Schwierig wird, diese Vorgehensweise zu adaptieren?

Ja, Du liest richtig :wink: .

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr.

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