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 Transparente Listbox (https://www.delphipraxis.net/21610-transparente-listbox.html)

Manzoni 5. Mai 2004 16:14


Transparente Listbox
 
Hi DP'ler,

ich suche ganz verzweifelt eine transparente Listbox-Komponente. Hat bzw. kennt einer von euch eine solche Komponente oder weiss wie man so etwas realisieren kann? Danke im Voraus.

shmia 5. Mai 2004 16:59

Re: Transparente Listbox
 
Im folgenden eine transparente Listbox (ungetestet):
Delphi-Quellcode:
type
  TTransparentListBox = class(TListBox)
  private
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

implementation

procedure TTransparentListBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle:= Params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TTransparentListBox.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  // in this case, we want to intercept the windows message. if we would want to
  // pass the message to the ancestor classes, we could use the keyword
  // "inherited" without the procedure name. example:
  //   inherited;
  Message.Result := 1;
end;
PS: Verschwende deine Zeit nicht mit nutzlosen optischen Gimmicks. :zwinker:

Manzoni 5. Mai 2004 19:31

Re: Transparente Listbox
 
danke für die Antwort, hat aber leider nicht funktioniert :(
Hab schon diesen Tipp ausprobiert, klappt aber leider nicht mit nem Bild darunter worauf es mir ankommt.

Manzoni 7. Mai 2004 12:28

Re: Transparente Listbox
 
hat keiner ne idee?

glkgereon 7. Mai 2004 19:06

Re: Transparente Listbox
 
was heisst transparent?
kann man das nit bei ner normalen ListBox einstellen
mom, muss ma eben an nem, anderen puti gucken...

glkgereon 7. Mai 2004 19:15

Re: Transparente Listbox
 
ne, hab ich nix zu gefunden

wobei man könnte mal gucken, ob man bei der farbe was tricksen kann, fürchte aber nein :(

toms 7. Mai 2004 19:24

Re: Transparente Listbox
 
Hi,

Habe mal eine TransparentListBox Komponente gefunden.
So wie sie jetzt ist funktioniert sie aber nur für nicht-scrollende Listboxen.


Delphi-Quellcode:
unit TransparentListBox;

(*
 *
 *  Written by Walter Irion (CIS 114254, 2455) after the THotSpot
 *  sample component that Arne Schäpers presented in the German
 *  c't magazine (issue 6/1996, pp. 286 ff.).
 *
 *  TTransparentListBox is far from being a universal solution:
 *  it does not prevent Windows' scrolling mechanism from
 *  shifting the background along with scrolled listbox lines.
 *  Moreover, the scroll bar remains hidden until the keyboard
 *  is used to change the selection, and the scroll buttons
 *  become visible only when clicked.
 *
 *  To break it short: TTransparentListBox is only suitable
 *  for non-scrolling lists.
 *
 *  In fact it must be possible to write a listbox component
 *  that handles scrolling correctly. But my essays to intercept
 *  EM_LINESCROLL messages were fruitles, even though I tried
 *  subclassing via WndProc.
 *
 *  A solution for transparent TEdit and TMemo controls is
 *  introduced in issue 9/1996 of the c't magazine, again
 *  by Arne Schäpers. But these are outright monsters with
 *  wrapper windows to receive notification messages as well
 *  as so-called pane windows that cover the actual control's
 *  client area and display its content.
 *
 *  Previous issues of the c't magazine can be ordered from:
 *
 *    c't-Kopierservice
 *    Helstorfer Str. 7
 *    30625 Hannover, Germany
 *
 *  They expect a crossed cheque amounting to DM 14,00
 *  to be included with your order, but I don't know about
 *  international orders.
 *
 *)

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TTransparentListBox = class(TListBox)
  private
    { Private declarations }
  protected
    { Protected declarations }
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
      override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  published
    { Published declarations }
    property Style default lbOwnerDrawFixed;
    property Ctl3D default False;
    property BorderStyle default bsNone;
  end;

procedure Register;

implementation

constructor TTransparentListBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Ctl3D := False;
  BorderStyle := bsNone;
  Style := lbOwnerDrawFixed; // changing it to lbStandard results
                              // in loss of transparency
end;

procedure TTransparentListBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TTransparentListBox.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
  Msg.Result := 1; // Prevent background from getting erased
end;

procedure TTransparentListBox.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  tlbVisible: Boolean;
begin
  tlbVisible := (Parent <> nil) and IsWindowVisible(Handle); // Check for visibility
  if tlbVisible then ShowWindow(Handle, SW_HIDE); // Hide-Move-Show strategy ...
  inherited SetBounds(ALeft, ATop, AWidth, AHeight); // ... to prevent background ...
  if tlbVisible then ShowWindow(Handle, SW_SHOW); // ... from getting copied
end;

procedure TTransparentListBox.DrawItem(Index: Integer; Rect: TRect; State:
  TOwnerDrawState);
var
  FoundStyle: TBrushStyle;
  R: TRect;

begin

  FoundStyle := Canvas.Brush.Style; // Remember the brush style

  R := Rect; // Adapt coordinates of drawing rect ...
  MapWindowPoints(Handle, Parent.Handle, R, 2); // ... to parent's coordinate system
  InvalidateRect(Parent.Handle, @R, True); // Tell parent to redraw the item position
  Parent.Update; // Trigger instant redraw (required)

  if not (odSelected in State) then begin // If an unselected line is being handled
    Canvas.Brush.Style := bsClear; //   use a transparent background
  end else begin // otherwise, if the line needs to be highlighted,
    Canvas.Brush.Style := bsSolid; //   some colour to the brush is essential
  end;

  inherited DrawItem(Index, Rect, State); // Do the regular drawing and give component users ...
                                          // ... a chance to provide an OnDrawItem handler

  Canvas.Brush.Style := FoundStyle; // Boy-scout rule No. 1: leave site as you found it

end;

procedure Register;
begin
  RegisterComponents('Samples', [TTransparentListBox]);
end;

end.

CalganX 7. Mai 2004 19:27

Re: Transparente Listbox
 
Hi toms,
Zitat:

Zitat von Manzoni
... Hab schon diesen Tipp ausprobiert, klappt aber leider nicht...

;)

Chris

toms 7. Mai 2004 19:28

Re: Transparente Listbox
 
Oops Sorry, bei mir klappt's eben.

glkgereon 7. Mai 2004 19:29

Re: Transparente Listbox
 
brauchst dus denn umbedingt?
so, wies aussieht, wirst du drauf verzichten müssen.. :cry:

Manzoni 7. Mai 2004 20:48

Re: Transparente Listbox
 
ja leider :( wär schon stylisch ne listbox zu haben und dahinter nen bild, aber naja man kann nicht immer alles haben. trotzdem danke für eure antworten

glkgereon 8. Mai 2004 16:31

Re: Transparente Listbox
 
:!:
!!!IDEE!!!

Machs doch andersrum, also Bild nach vorne, transparentmachen

oder ist da ein nichtbedachter haken?

Manzoni 9. Mai 2004 14:21

Re: Transparente Listbox
 
hat leider nicht funktioniert :(
die listbox blieb leider immer im vordergrund. die labels wurden vom bild überdeckt obwohl dieses transparent war.
trotzdem ne innovative idee :-D

glkgereon 10. Mai 2004 13:50

Re: Transparente Listbox
 
das kann an folgendem liegen(hab ich mich schon mal nen GANZEN tag mit rumgeärgert):

wenn du erst das bild und dann die listbox erstellst, ist die listbox vorne, versuchs mal erst listbox erstellen

ich weiss nicht ob das hilft, weils damals bei mir andere komponenten waren...

Manzoni 10. Mai 2004 15:13

Re: Transparente Listbox
 
hat leider auch nicht gefunzt :cry:

glkgereon 11. Mai 2004 18:39

Re: Transparente Listbox
 
hmm, dann musst du wohl ohne auskommen :(

du bist einer der wenigen, denen nicht zu helfen ist :-D :-D :-D

Manzoni 11. Mai 2004 18:51

Re: Transparente Listbox
 
ohja, ich weiß ich warte schon auf die männer in weiss :wink: :wink: :wink: :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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-2025 by Thomas Breitkreuz