Solved

Problem with Transparent TMemo

Posted on 2010-11-11
1
579 Views
Last Modified: 2016-08-27
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
Comment
Question by:rotem156
1 Comment
 
LVL 24

Accepted Solution

by:
jimyX earned 500 total points
ID: 34110609
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).
Many functions in Excel can make decisions. The most simple of these is the IF function: it returns a value depending on whether a condition you describe is true or false. Once you get the hang of using the IF function, you will find it easier to us…

896 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now