unit CustomControl1;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
LCLIntf, LCLType, LMessages, Types;
type
TCustomControl1 = class(TCustomControl)
private
procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
procedure WMMove(var Message: TLMessage); message LM_MOVE;
function GetTextSize: TSize;
protected
procedure Paint; override;
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
published
property Text;
property Font;
property Align;
property Anchors;
property Visible;
property OnClick;
property OnDblClick;
end;
procedure Register;
implementation
constructor TCustomControl1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csOpaque];
Width := 100;
Height := 50;
DoubleBuffered := False;
end;
procedure TCustomControl1.CMTextChanged(var Message: TLMessage);
begin
Invalidate;
end;
procedure TCustomControl1.CMFontChanged(var Message: TLMessage);
begin
Invalidate;
end;
procedure TCustomControl1.WMMove(var Message: TLMessage);
begin
inherited;
Invalidate;
end;
procedure TCustomControl1.Resize;
begin
inherited Resize;
Invalidate;
end;
procedure TCustomControl1.Paint;
var
i: Integer;
R: TRect;
begin
if Parent = nil then Exit;
Parent.Perform(LM_ERASEBKGND, Canvas.Handle, 0);
for i := 0 to Parent.ControlCount - 1 do
begin
if (Parent.Controls[i] = Self) then Break;
if Parent.Controls[i].Visible then
begin
R := Parent.Controls[i].BoundsRect;
SaveDC(Canvas.Handle);
try
// shift coordinate system
SetWindowOrgEx(Canvas.Handle, Left-Parent.Controls[i].left , Top-Parent.Controls[i].top, nil);
Parent.Controls[i].Perform(LM_PAINT, Canvas.Handle, 0);
finally
RestoreDC(Canvas.Handle, -1);
end;
end;
end;
Brush.Style := bsClear;
Canvas.TextOut(10, 10, Text);
end;
procedure Register;
begin
RegisterComponents('Additional', [TCustomControl1]);
end;
end.