AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponente informieren, wenn Formular - Caption / Icon geä.
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente informieren, wenn Formular - Caption / Icon geä.

Ein Thema von dataspider · begonnen am 12. Dez 2005 · letzter Beitrag vom 12. Dez 2005
Antwort Antwort
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#1

Komponente informieren, wenn Formular - Caption / Icon geä.

  Alt 12. Dez 2005, 18:52
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Komponente informieren, wenn Formular - Caption / Icon g

  Alt 12. Dez 2005, 19:03
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Komponente informieren, wenn Formular - Caption / Icon g

  Alt 12. Dez 2005, 19:13
Danke erst mal für die schnelle Antwort,
aber geht es auch, ohne im Formular etwas zu ändern?
Gruß, Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Komponente informieren, wenn Formular - Caption / Icon g

  Alt 12. Dez 2005, 19:17
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Komponente informieren, wenn Formular - Caption / Icon g

  Alt 12. Dez 2005, 19:20
Wie machst du das, so schnell zu antworten
Danke, das sieht sehr gut aus. Ich denke, das wird funktionieren.
Gruß, Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Komponente informieren, wenn Formular - Caption / Icon g

  Alt 12. Dez 2005, 19:26
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
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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