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 Komponente informieren, wenn Formular - Caption / Icon geä. (https://www.delphipraxis.net/58790-komponente-informieren-wenn-formular-caption-icon-geae.html)

dataspider 12. Dez 2005 18:52


Komponente informieren, wenn Formular - Caption / Icon geä.
 
Hallo,
ich habe eine Komponente von TGraphicControl abgeleitet, welche das Icon und die Caption des Parent - Forms zeichnet. Das benutze ich bei Formularen, welche ein Parenthandle bekommen und deren Titelleiste nicht sichtbar ist.
Es funktioniert auch. Aber wenn ich z.B. die Caption des Formulares im Code ändere, muss ich meine Komponente anweisen, neu zu zeichnen. Aber, wie kann meine Komponente die Info erhalten, dass sich am Formular etwas geändert hat? Kann ich irgendeine Botschaft WM_Paint ... des Formulares in meiner Kompo abfangen?
Danke, Frank

SirThornberry 12. Dez 2005 19:03

Re: Komponente informieren, wenn Formular - Caption / Icon g
 
du brauchst einfach nur die WindowProc des Forms umleiten und auf WM_SetText prüfen:
Delphi-Quellcode:
  private
    fOldMethod: TWndMethod;
    procedure FNewWndProc(var AMsg: TMessage);
[...]
procedure TForm1.FNewWndProc(var AMsg: TMessage);
begin
  if (AMsg.Msg = WM_SETTEXT) then
  begin
    //In PChar(AMsg.LParam) steht die neue Caption
  end;
  fOldMethod(AMsg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fOldMethod := WindowProc;
  WindowProc := FNewWndProc;
end;

dataspider 12. Dez 2005 19:13

Re: Komponente informieren, wenn Formular - Caption / Icon g
 
Danke erst mal für die schnelle Antwort,
aber geht es auch, ohne im Formular etwas zu ändern?
Gruß, Frank

SirThornberry 12. Dez 2005 19:17

Re: Komponente informieren, wenn Formular - Caption / Icon g
 
als eigene Komponente würde das so aussehen:
Delphi-Quellcode:
unit uCustomTitleBar;

interface

uses
  windows, graphics, classes, Controls, Forms, messages;

type
  TCustomTitleBar = class(TCustomControl)
  protected
    procedure SetParent(AParent: TWinControl); override;
  private
    fBGPic: TBitmap;
    fNeedsRecreate: Boolean;
    fOldMethod: TWndMethod;
    procedure FCreateBGPic;
    procedure FNewWndProc(var AMsg: TMessage);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure Paint; override;
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  end;

implementation

procedure TCustomTitleBar.SetParent(AParent: TWinControl);
var LForm: TCustomForm;
begin
  if AParent <> Parent then
  begin
    if Parent <> nil then
    begin
      LForm := GetParentForm(Self);
      LForm.WindowProc := fOldMethod;
    end;
    inherited SetParent(AParent);
    if Parent <> nil then
    begin
      LForm := GetParentForm(Self);
      fOldMethod := LForm.WindowProc;
      LForm.WindowProc := FNewWndProc;
    end;
  end;
end;


constructor TCustomTitleBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fBGPic := TBitmap.Create;
  fNeedsRecreate := True;
  SetBounds(0, 0, 100, 100);
end;

destructor TCustomTitleBar.Destroy;
begin
  Parent := nil;
  fBGPic.Free;
  inherited Destroy;
end;

procedure TCustomTitleBar.Paint;
begin
  if fNeedsRecreate then
    FCreateBGPic;
  BitBlt(Canvas.Handle, 0, 0, Width, Height, fBGPic.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TCustomTitleBar.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var LResized: Boolean;
begin
  LResized := (AWidth <> Width) or (AHeight <> Height);
  inherited;
  fNeedsRecreate := True;
  Repaint;
end;

procedure TCustomTitleBar.FCreateBGPic;
begin
  fBGPic.Width := Width;
  fBGPic.Height := Height;
  fBGPic.Canvas.Brush.Color := clBlue;
  fBGPic.Canvas.FillRect(Rect(0, 0, fBGPic.Width, fBGPic.Height));
  fBGPic.Canvas.TextOut(0, 0, GetParentForm(Self).Caption);
  fNeedsRecreate := False;
end;

procedure TCustomTitleBar.FNewWndProc(var AMsg: TMessage);
begin
  fOldMethod(AMsg);
  if (AMsg.Msg = WM_SETTEXT) then
    Repaint;
end;


end.
Das malen passiert im FCreateBGPic. Also dort einfach den gewünschten Paint-Source einfügen.

dataspider 12. Dez 2005 19:20

Re: Komponente informieren, wenn Formular - Caption / Icon g
 
Wie machst du das, so schnell zu antworten ;)
Danke, das sieht sehr gut aus. Ich denke, das wird funktionieren.
Gruß, Frank

SirThornberry 12. Dez 2005 19:26

Re: Komponente informieren, wenn Formular - Caption / Icon g
 
Als ich dein Post gelesen hab dachte ich mir das es doch recht einfach gehen müsste und hab das einfach selbst mal probiert. Und dann hast du genauer nachgefragt als ich grad mit meiner Test-Komponente fertig war :mrgreen:
Hab das ganze gerade nochmal abgeändert so dass, das Bild nicht bei jedem Paint neu berechnet/zusammengebaut werden muss sondern nur wenn sich was ändert. Ansonsten wir das gespeichert Bild vom letzten Paint einfach wieder hingemalt (wird in fBGPic zwischengespeichert und nur bei Bedarf neu gemalt).
Das gepostete reagiert übrigens nur wenn sich die Caption des Forms geändert hat. Wenn sich das Icon geändert hat muss man noch eine andere Message abfangen die mir aber grad nicht bekannt ist.


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