Form - Desenhando no caption

Top  Previous  Next

// Este exemplo demonstra como desenhar na barra de titulo

// Testado e aprovado pelo INMETRO

 

type

  TForm1 = class(TForm)

  private

    { Private declarations }

  public

    procedure DesenhaTitulo;

    procedure M_PintarForm(var M: TMessage);    message WM_NCPAINT;

    procedure M_TrocarCaption(var M: TMessage); message WM_SETTEXT;

    procedure M_Ativa(var M: TMessage);         message WM_NCACTIVATE;

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.DesenhaTitulo;

var

  X, Y: Integer;

  R   : TRect;

  C   : TCanvas;

begin

  // Obtem a pos do desenho (frame + btn)

  X := GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXSIZE) + 2;

  Y := GetSystemMetrics(SM_CYFRAME) + 1;

  R.Left := X;

  R.Top  := Y;

  // Obtem dimensoes do rect do desenho

  R.Right  := Width - 3 * GetSystemMetrics(SM_CXSIZE) - 2 * GetSystemMetrics(SM_CXFRAME);

  R.Bottom := GetSystemMetrics(SM_CYSIZE);

  // cria o canvas

  C := TCanvas.Create;

  C.Handle := GetWindowDC( Self.Handle );

  try

    C.Pen.Color := clYellow;

    C.Ellipse(R.Left + 60, R.Top + 3, R.Left + 70, R.Top + 13); // Desenha uma bolota

    // Fonte:

    C.Font.Name := 'Arial';

    C.Font.Color:= clAqua;

    if Active then

      C.Brush.Color := GetSysColor( COLOR_ACTIVECAPTION )

    else

      C.Brush.Color := GetSysColor( COLOR_INACTIVECAPTION );

    DrawText(C.Handle, PChar(Caption), -1, R, DT_LEFT);

  finally

    ReleaseDC(Self.Handle, C.Handle);

    C.Handle := 0;

  end;

end;

 

procedure TForm1.M_Ativa(var M: TMessage);

begin

  inherited;

  DesenhaTitulo;

end;

 

procedure TForm1.M_PintarForm(var M: TMessage);

begin

  inherited;

  DesenhaTitulo;

end;

 

procedure TForm1.M_TrocarCaption(var M: TMessage);

begin

  inherited;

  DesenhaTitulo;

end;