![]() |
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 |
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; |
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 |
Re: Komponente informieren, wenn Formular - Caption / Icon g
als eigene Komponente würde das so aussehen:
Delphi-Quellcode:
Das malen passiert im FCreateBGPic. Also dort einfach den gewünschten Paint-Source einfügen.
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. |
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 |
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 22:35 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