unit TrMemo;
{$R-}
interface
uses Messages, Controls, StdCtrls,classes;
const TMWM__SpecialInvalidate=WM_USER+1111;
type
TTransparentMemo =
class(TMemo)
private
procedure SpecialInvalidate(
var Message:TMessage);
message
TMWM__SpecialInvalidate;
procedure WMHScroll(
var Message: TWMHScroll);
message WM_HSCROLL;
procedure WMVScroll(
var Message: TWMVScroll);
message WM_VSCROLL;
procedure WMSetText(
var Message:TWMSetText);
message WM_SETTEXT;
procedure CNCTLCOLOREDIT(
var Message:TWMCTLCOLOREDIT);
message
CN_CTLCOLOREDIT;
procedure WMKeyDown(
var Message: TWMKeyDown);
message WM_KEYDOWN;
procedure WMEraseBkgnd(
var Message: TWMEraseBkgnd);
message
WM_ERASEBKGND;
protected
procedure CreateParams(
var Params: TCreateParams);
override;
public
constructor Create(AOwner: TComponent);
override;
end;
procedure Register;
implementation
uses Windows;
{ TTransparentMemo }
procedure TTransparentMemo.WMHScroll(
var Message: TWMHScroll);
begin
inherited;
PostMessage(
Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.WMVScroll(
var Message: TWMVScroll);
begin
SendMessage(
Handle,TMWM__SpecialInvalidate,0,0);
inherited;
PostMessage(
Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.CNCTLCOLOREDIT(
var Message:TWMCTLCOLOREDIT);
begin
with Message do
begin
SetBkMode(ChildDC,TRANSPARENT);
Result:=GetStockObject(HOLLOW_BRUSH)
end
end;
procedure TTransparentMemo.WMSetText(
var Message:TWMSetText);
begin
inherited;
if not (csDesigning
in ComponentState)
then
PostMessage(
Handle,TMWM__SpecialInvalidate,0,0)
end;
procedure TTransparentMemo.SpecialInvalidate(
var Message:TMessage);
var r:TRect;
begin
if Parent<>
nil then
begin
r:=ClientRect;
r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
InvalidateRect(Parent.Handle,@r,true);
RedrawWindow(
Handle,
nil,0,RDW_FRAME+RDW_INVALIDATE)
end;
end;
procedure TTransparentMemo.WMKeyDown(
var Message: TWMKeyDown);
begin
SendMessage(
Handle,TMWM__SpecialInvalidate,0,0);
inherited;
PostMessage(
Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.WMEraseBkgnd(
var Message: TWMEraseBkgnd);
begin
Message.Result:=1
end;
constructor TTransparentMemo.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=[csCaptureMouse, csDesignInteractive,
csClickEvents, csSetCaption, csOpaque, csDoubleClicks,
csReplicatable, csNoStdEvents];
end;
procedure TTransparentMemo.CreateParams(
var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params
do
begin
ExStyle:=ExStyle
or WS_EX_TRANSPARENT
and not WS_EX_WINDOWEDGE
and not WS_EX_STATICEDGE
and not WS_EX_DLGMODALFRAME
and not
WS_EX_CLIENTEDGE;
end;
end;
procedure Register;
begin
RegisterComponents('
cool!', [tTransparentMemo]);
end;
end.