const
BorderRec: array[TBorderStyle] of Integer = (1, -1);
procedure Register;
begin
RegisterComponents('EU', [TUsrMemo]);
end;
function GetScreenClient(Control: TControl): TPoint;
var
p: TPoint;
begin
p := Control.ClientOrigin;
ScreenToClient(Control.Parent.Handle, p);
Result := p;
end;
destructor TUsrMemo.Destroy;
begin
inherited Destroy;
end;
procedure TUsrMemo.SetTransparent(Value: Boolean);
begin
if FTransparent <> Value then
begin
FTransparent := Value;
Invalidate;
end;
end;
procedure TUsrMemo.SetModiFlag(Value:Boolean);
begin
if FModiFlag <> Value then
begin
FModiFlag :=Value;
Invalidate;
end;
end;
procedure TUsrMemo.WMEraseBkGnd(var Message: TWMEraseBkGnd);
var
DC: hDC;
i: integer;
p: TPoint;
begin
if FTransparent then
begin
if Assigned(Parent) then
begin
DC := Message.DC;
i := SaveDC(DC);
p := GetScreenClient(self);
p.x := -p.x;
p.y := -p.y;
MoveWindowOrg(DC, p.x, p.y);
SendMessage(Parent.Handle, $0014, DC, 0);
TCtrl(Parent).PaintControls(DC, nil);
RestoreDC(DC, i);
end;
end
else
inherited;
end;
procedure TUsrMemo.WMPaint(var Message: TWMPaint);
begin
inherited;
if FTransparent then
if not FPainting then
RepaintWindow;
end;
procedure TUsrMemo.WMNCPaint(var Message: TMessage);
begin
inherited;
end;
procedure TUsrMemo.CNCtlColorEdit(var Message: TWMCtlColorEdit);
begin
inherited;
if FTransparent then
SetBkMode(Message.ChildDC, 1);
end;
procedure TUsrMemo.CNCtlColorStatic(var Message: TWMCtlColorStatic);
begin
inherited;
if FTransparent then
SetBkMode(Message.ChildDC, 1);
end;
procedure TUsrMemo.CMParentColorChanged(var Message: TMessage);
begin
inherited;
if FTransparent then
Invalidate;
end;
procedure TUsrMemo.WMSize(var Message: TWMSize);
begin
inherited;
Invalidate;
end;
procedure TUsrMemo.WMMove(var Message: TWMMove);
begin
inherited;
Invalidate;
end;
procedure TUsrMemo.RepaintWindow;
var
DC: hDC;
TmpBitmap, Bitmap: hBitmap;
begin
if FTransparent then
begin
FPainting := true;
HideCaret(Handle);
DC := CreateCompatibleDC(GetDC(Handle));
TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
Bitmap := SelectObject(DC, TmpBitmap);
PaintTo(DC, 0, 0);
BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, 1, 1,
SRCCOPY);
SelectObject(DC, Bitmap);
DeleteDC(DC);
ReleaseDC(Handle, GetDC(Handle));
DeleteObject(TmpBitmap);
ShowCaret(Handle);
FPainting := false;
end;
end;
procedure TUsrMemo.Change;
begin
RepaintWindow;
inherited Change;
end;
procedure TUsrMemo.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
end;
function TUsrMemo.GetTextLayout: TTextLayout;
begin
Result := FTextLayout;
end;
procedure TUsrMemo.SetTextLayout(Value:TTextLayout); //Layout属性
begin
FTextLayout:=Value;
DrawText;
end;
function TUsrMemo.GetMemoText: string;
begin
Result :=Trim(Text);
end;
procedure TUsrMemo.DrawText; //垂直对齐
var
Rct: TRect;
YOffset:integer;
Text:string;
begin
Text :=GetMemoText;
case FTextLayout of
tlTop: YOffset := 0;
tlCenter: YOffset := (ClientHeight - Canvas.TextHeight(Text)) div 2 + 1;
tlBottom: YOffset := ClientHeight - Canvas.TextHeight(Text);
else
YOffset := 0;
end;
Rct:=Rect(0,0,ClientWidth,ClientHeight);
Canvas.TextRect(Rct,0,YOffset,Text);
end;