Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

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 Eigene Button Komponente (https://www.delphipraxis.net/91147-eigene-button-komponente.html)

.chicken 8. Mai 2007 19:19

Re: Eigene Button Komponente
 
Den PaintHandler kann ich nicht überschreiben sagt er mir weil er statisch ist, aber jetzt klappt alles einigermaßen ;-)

Alter Mann 8. Mai 2007 20:36

Re: Eigene Button Komponente
 
Hi,

was ist denn das?
Zitat:

constructor TGraphicButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

FPicture := TBitmap.Create;
Picture := TBitmap.Create;
end;
FBitmap ist die lokale Variable innerhalb deines Objektes und Picture der öffentlicher Verweis darauf, wozu dann
Zitat:

Picture := TBitmap.Create;
das wäre doppeltgemoppelt.

Und warum TBitmap? Normaler Weise sollte es so aussehen:

Delphi-Quellcode:
  TGraphicButton = class(TCustomControl)
  private
    ...
    FPicture: TPicture;
    procedure SetPicture(Value: TPicture);
    ...
    property Picture: TPictureread FPicture write SetPicture;
  end;
Damit ist es egal ob die Quelle eine Bitmap, JPEG, PNG oder sonst etwas ist.

Bezüglich des Overheat sollte allerdings von TGraphicControl abgeleitet werden, steht auch so in der Hilfe.

TStringlist 8. Mai 2007 22:20

Re: Eigene Button Komponente
 
Zitat:

Zitat von .chicken
Den PaintHandler kann ich nicht überschreiben sagt er mir weil er statisch ist

Der PaintHandler (siehe auch OH) ist die Botschaftsbehandlungsroutine für die WM_Paint-Message und wird ohne "override" einfach so überschrieben:

Delphi-Quellcode:
private
  ...
  procedure PaintHandler(var AMessage : TWMPaint); message wm_Paint;
public
  ...
Wenn du den PaintHandler nicht überschreibst, dann malt der nämlich auch immer noch ein bisschen mit, und zwar initialisiert der vorab die Grundfläche deines Controls mit der Parent-Color. Und erst darauf pinselst Du dann wieder (wahrscheinlich auch zuerst eine Initialisierung mit der clBtnFace-Color o.ä.). Es ist also besser, wenn man seine Malarbeiten gleich selbst in diesem PaintHandler ausführt. Ansonsten könnte es u.U. durch dessen eigenes Initialisieren mit der Parent-Color auch noch zu einem leichten Flackern kommen.


Bzgl. des PaintHandlers wäre dann eigentlich nur noch mehr wichtig, dass die ganzen Arbeiten dort in ein BeginPaint u. EndPaint eingekleidet sind:

Delphi-Quellcode:
procedure TOwnButton.PaintHandler(var AMessage: TWMPaint);
var APaintStruct : TPaintStruct;
begin
  BeginPaint(Handle,APaintStruct);

  // primäres Initialisieren der Button-Grundfläche
  ...

  with Canvas do
  if not ButtonIsPressed then begin // wenn der "Button" NICHT gedrückt ist
    // dann event. ein Bitmap malen mit BitBlt o. TransparentBlt
    ...
    // dann eine Caption schreiben
    ...
    // dann den Rahmen pinseln
    ...
    // und ganz zum Schluß event. noch einen Focus-Ring malen
    ...
  end
  else begin // dann ist der "Button" gedrückt...
    // wie darüber, nur eben jetzt bzgl. einer gedrückten Button
    ...
  end;

  EndPaint(Handle,APaintStruct);
end;
so z.B., oder eben alles +/- ziemlich ähnlich, natürlich :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.
Seite 5 von 5   « Erste     345   

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