
Try a rewritten label component that uses a bitmap instead of the straight
canvas:

unit Freelbl;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TFreeLabel = class(TGraphicControl)
  private
    { Private declarations }
    procedure WMERASEBKGND(var msg:TWMERASEBKGND); message WM_ERASEBKGND;
    procedure CMFONTCHANGED(var msg:TMsg); message CM_FONTCHANGED;
    procedure CMTEXTCHANGED(var msg:TMsg); message CM_TEXTCHANGED;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(Aowner:TComponent); override;
    procedure Paint; override;
  published
    { Published declarations }
    property Caption;
    property Align;
    property Color;
    property Font;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TFreeLabel]);
end;

constructor TFreeLabel.Create(Aowner:TComponent);
begin
 inherited Create(Aowner);
 ControlStyle := [csOpaque];
end;

procedure TFreeLabel.Paint;
var t:TBitmap;
    r:TRect;
    Text:array[0..255] of Char;
begin
 T:=TBitmap.Create;
 t.width:=width;
 t.height:=height;

 with t.canvas do
  begin
   brush.color:=self.color;
   r:=Rect(0,0,width,height);

   fillrect(r);

   font:=self.font;

   StrPCopy(Text, Caption);
   DrawText(t.canvas.Handle, Text, StrLen(Text), R, DT_CENTER or
      DT_VCENTER or DT_WORDBREAK);
  end;
 canvas.draw(0,0,t);
 t.free;
end;

procedure TFreeLabel.CMFONTCHANGED(var msg:TMsg);
begin
 invalidate;
end;

procedure TFreeLabel.CMTEXTCHANGED(var msg:TMsg);
begin
 invalidate;
end;

procedure TFreeLabel.WMERASEBKGND(var msg:TWMERASEBKGND);
begin
 { Since we blot out the background in the paint method, there is no need
   to be redundant. }
 msg.result:=1;
end;

end.
