• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 622
  • Last Modified:

Problem with Transparent TMemo

I'm having trouble with this component, it won't let me change its Font.Color and when I write some lines to it, it will look ugly, like in the picture I attached, how can I avoid this ?


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 Create(AOwner);
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_STATICEDGE
       and not WS_EX_DLGMODALFRAME
       and not WS_EX_WINDOWEDGE
       and not WS_EX_CLIENTEDGE;
  end;
end;

procedure Register;
begin
  RegisterComponents('Custom', [tTransparentMemo]);
end;

end.

Open in new window

Untitled.png
0
rotem156
Asked:
rotem156
1 Solution
 
jimyXCommented:
An alternative (if not better it is the same) you can use TRichEdit and put the following at the Form OnCreate:

Richedit1.Brush.Style:=BsClear;
SetWindowLong(Form1.Richedit1.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);


From:
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20885497.html
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now