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 CustomControl nach Repaint nicht mehr transparent (https://www.delphipraxis.net/125504-customcontrol-nach-repaint-nicht-mehr-transparent.html)

Red six 7. Dez 2008 17:26


CustomControl nach Repaint nicht mehr transparent
 
Hallo Leute,

ich bau mir zur Zeit ein etwas ansprechenderes Interface für ein Programm. Speziell arbeite ich gerade an einer Art Button.
Das ganze ist abgeleitet von TCustomControl, transparent, in der Paint Methode wird ein Teiltransparentes PNG ins Canvas kopiert.

Folgende Problematik: Sobald ich das Element neu malen will (Repaint), geht die Transparenz flöten und ein weißer Hintergrund erscheint hinter den transparenten Stellen des PNGs! Dasselbe bei Invalidate, bei der normalen Paint Methode läuft Alles problemlos (minimieren-maximieren -> alles wieder normal).


Hier die relevanten Codeauszüge:

Delphi-Quellcode:
constructor TPControl.Create(AOwner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle-[csOpaque]+[csAcceptsControls];
end;

procedure TPControl.CreateParams(var Params: TCreateParams);
begin
  inherited
  CreateParams(Params);
  Params.ExStyle := Params.ExStyle+WS_EX_Transparent;
end;

procedure TPControl.Paint;
begin
  inherited;
  Canvas.Draw(0, 0, Images.Graphic);
end;

Und dann zB bei...

Delphi-Quellcode:
procedure TPControl.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  FMouseOver := True;
  Repaint; //<-------------!!!
end;
...tritt der Fehler auf. Aber auch wenn ich Repaint/Invalidate über das Programm aufrufe.

Canvas füllen geht nicht, da der Hintergrund variiert!


Ich hoffe Ihr habt da ne Idee,

mfg

omata 7. Dez 2008 17:32

Re: CustomControl nach Repaint nicht mehr transparent
 
Und wenn du deine Paint-Methode zum Zeichnen benutzt?

Delphi-Quellcode:
procedure TPControl.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  FMouseOver := True;
  Paint;
end;

Red six 7. Dez 2008 17:39

Re: CustomControl nach Repaint nicht mehr transparent
 
Ja das klappt schon, trotzdem wurmt mich das :wink:

omata 7. Dez 2008 17:41

Re: CustomControl nach Repaint nicht mehr transparent
 
Naja, das zeigt dir aber, das das Repaint nicht deine Paint-Methode aufruft. Wenn du das Verhalten haben möchtest, dann musst du deine Komponente eben dementsprechend abändern.

Red six 7. Dez 2008 17:54

Re: CustomControl nach Repaint nicht mehr transparent
 
Es würde mich allerdings interessieren was da passiert, ich will ja nicht Repaint überschreiben ohne zu wissen was es genau tut.

Zitat:

Durch einen Aufruf von Repaint wird das Steuerelement veranlasst, sich sofort erneut zu zeichnen. Wenn die Eigenschaft ControlStyle den Wert csOpaque enthält, zeichnet sich das Steuerelement direkt selbst. Andernfalls ruft Repaint zunächst Invalidate und danach Update auf, damit auch alle sichtbaren Bereiche der Komponenten unter dem Steuerelement erneut gezeichnet werden.

Red six 9. Dez 2008 10:44

Re: CustomControl nach Repaint nicht mehr transparent
 
Naja, wäre zwar interessant gewesen, bin aber jetzt auf ein GraphicControl umgestiegen.

mfg


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