[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
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.
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]