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;
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.