Q&A

  • EDIT를 투명하게?
EDIT컴포넌트를 투명하게 하려고 그러는데요..

EDIT는 폼이나 판넬과는 다르게 잘 안되네요..



아시는 분 계시면 좀 가르쳐주세요..





2  COMMENTS
  • Profile
    남기룡 2000.12.02 02:29
    남기룡 wrote:

    > EDIT컴포넌트를 투명하게 하려고 그러는데요..

    > EDIT는 폼이나 판넬과는 다르게 잘 안되네요..

    >

    > 아시는 분 계시면 좀 가르쳐주세요..

    >

    >



    delphi3000에 있더군요..-.-

    제가 너무 성급하게 질문했네요......-.-





    Question/Problem/Abstract:



    How can I build a transparent edit control?

    Answer:





    Building a transparent edit control can be the cool face of your application. Why? Because your entry forms can look like "paper forms". Adding this cool features for your application can be very easy, as you will see bellow.



    First of all I want to specify that is not my original code. I have found a transparent edit, listbox, checkbox and memo controls in FusedControls, but the main goal of this library is the flicker. Is impossible for anyone to distribute a applicatin with this controls because the flicker is in supportable.



    An now, go to work. All we have to do is to overrwide the CreateParams and some common events. In order to resolve the flicker I have decide to let our edit control transparent only when the focus is not on it. So, I have override the DoEnter and DoExit. The entire code is bellow. Just copy, paste in a blank unit and install the component.





    unit RbsWiredEdit;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    const

    TWM_RbsInvalidate=WM_USER+1;



    type

    TRbsWiredEdit = class(TEdit)

    private

    { Private declarations }

    procedure RbsInvalidate(var Message:TMessage); message

    TWM_RbsInvalidate;

    procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message

    CN_CTLCOLOREDIT;

    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

    procedure WMMove(var Message: TMessage); message WM_MOVE;



    protected

    { Protected declarations }

    FTransparent: boolean;

    procedure CreateWnd; override;

    procedure CreateParams(var Params: TCreateParams); override;

    procedure DoExit; override;

    procedure DoEnter; override;

    public

    { Public declarations }

    constructor Create(AOwner: TComponent); override;

    procedure Invalidate; override;



    published

    { Published declarations }

    end;



    procedure Register;



    implementation



    constructor TRbsWiredEdit.Create(AOwner:TComponent);

    begin

    inherited create(AOwner);

    ftransparent:=true;

    end;



    procedure TRbsWiredEdit.CreateWnd;

    begin

    inherited CreateWnd;

    if fTransparent then

    begin

    SetWindowLong(Parent.Handle, GWL_STYLE,

    GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);

    end;

    end;



    procedure TRbsWiredEdit.RbsInvalidate(var Message:TMessage);

    var r:TRect;

    begin

    if (Parent<>nil) and FTransparent then

    begin

    r:=ClientRect;

    r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));

    r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));

    RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);

    end;

    end;



    procedure TRbsWiredEdit.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);

    begin

    if FTransparent then

    with Message do

    begin

    SetBkMode(ChildDC,Windows.TRANSPARENT);

    Result:=GetStockObject(HOLLOW_BRUSH)

    end

    else inherited;

    end;







    procedure TRbsWiredEdit.WMEraseBkgnd(var Message:TWMERASEBKGND);

    begin

    if FTransparent and not (csDesigning in ComponentState) then

    PostMessage(Handle,TWM_RbsInvalidate,0,0)

    else inherited;

    end;



    procedure TRbsWiredEdit.WMMove(var message:TMessage);

    begin

    inherited;

    if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

    else Invalidate;

    end;



    procedure TRbsWiredEdit.CreateParams(var Params:TCreateParams);

    begin

    inherited CreateParams(Params);

    if (CsDesigning in ComponentState) then exit;

    with Params do

    begin

    ExStyle:=ExStyle or WS_EX_TRANSPARENT;

    end;

    end;



    procedure TRbsWiredEdit.DoExit;

    begin

    inherited;

    FTransparent:=true;

    SetCursor(0);

    RecreateWnd;

    end;



    procedure TRbsWiredEdit.DoEnter;

    var exstyle,stdstyle:longint;

    begin

    inherited;

    Ftransparent:=false;

    StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);

    exStyle:= StdStyle and not WS_EX_TRANSPARENT;

    Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);

    invalidate;

    end;



    procedure TRbsWiredEdit.Invalidate;

    begin

    if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

    else inherited;

    end;



    procedure Register;

    begin

    RegisterComponents('Rombest', [TRbsWiredEdit]);

    end;



    end.



  • Profile
    이홍석 2000.12.02 07:55
    남기룡 wrote:

    > 남기룡 wrote:

    > > EDIT컴포넌트를 투명하게 하려고 그러는데요..

    > > EDIT는 폼이나 판넬과는 다르게 잘 안되네요..

    > >

    > > 아시는 분 계시면 좀 가르쳐주세요..

    > >

    > >

    >

    > delphi3000에 있더군요..-.-

    > 제가 너무 성급하게 질문했네요......-.-

    >

    >

    > Question/Problem/Abstract:

    >

    > How can I build a transparent edit control?

    > Answer:

    >

    >

    > Building a transparent edit control can be the cool face of your application. Why? Because your entry forms can look like "paper forms". Adding this cool features for your application can be very easy, as you will see bellow.

    >

    > First of all I want to specify that is not my original code. I have found a transparent edit, listbox, checkbox and memo controls in FusedControls, but the main goal of this library is the flicker. Is impossible for anyone to distribute a applicatin with this controls because the flicker is in supportable.

    >

    > An now, go to work. All we have to do is to overrwide the CreateParams and some common events. In order to resolve the flicker I have decide to let our edit control transparent only when the focus is not on it. So, I have override the DoEnter and DoExit. The entire code is bellow. Just copy, paste in a blank unit and install the component.

    >

    >

    > unit RbsWiredEdit;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > const

    > TWM_RbsInvalidate=WM_USER+1;

    >

    > type

    > TRbsWiredEdit = class(TEdit)

    > private

    > { Private declarations }

    > procedure RbsInvalidate(var Message:TMessage); message

    > TWM_RbsInvalidate;

    > procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message

    > CN_CTLCOLOREDIT;

    > procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

    > procedure WMMove(var Message: TMessage); message WM_MOVE;

    >

    > protected

    > { Protected declarations }

    > FTransparent: boolean;

    > procedure CreateWnd; override;

    > procedure CreateParams(var Params: TCreateParams); override;

    > procedure DoExit; override;

    > procedure DoEnter; override;

    > public

    > { Public declarations }

    > constructor Create(AOwner: TComponent); override;

    > procedure Invalidate; override;

    >

    > published

    > { Published declarations }

    > end;

    >

    > procedure Register;

    >

    > implementation

    >

    > constructor TRbsWiredEdit.Create(AOwner:TComponent);

    > begin

    > inherited create(AOwner);

    > ftransparent:=true;

    > end;

    >

    > procedure TRbsWiredEdit.CreateWnd;

    > begin

    > inherited CreateWnd;

    > if fTransparent then

    > begin

    > SetWindowLong(Parent.Handle, GWL_STYLE,

    > GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);

    > end;

    > end;

    >

    > procedure TRbsWiredEdit.RbsInvalidate(var Message:TMessage);

    > var r:TRect;

    > begin

    > if (Parent<>nil) and FTransparent then

    > begin

    > r:=ClientRect;

    > r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));

    > r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));

    > RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);

    > end;

    > end;

    >

    > procedure TRbsWiredEdit.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);

    > begin

    > if FTransparent then

    > with Message do

    > begin

    > SetBkMode(ChildDC,Windows.TRANSPARENT);

    > Result:=GetStockObject(HOLLOW_BRUSH)

    > end

    > else inherited;

    > end;

    >

    >

    >

    > procedure TRbsWiredEdit.WMEraseBkgnd(var Message:TWMERASEBKGND);

    > begin

    > if FTransparent and not (csDesigning in ComponentState) then

    > PostMessage(Handle,TWM_RbsInvalidate,0,0)

    > else inherited;

    > end;

    >

    > procedure TRbsWiredEdit.WMMove(var message:TMessage);

    > begin

    > inherited;

    > if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

    > else Invalidate;

    > end;

    >

    > procedure TRbsWiredEdit.CreateParams(var Params:TCreateParams);

    > begin

    > inherited CreateParams(Params);

    > if (CsDesigning in ComponentState) then exit;

    > with Params do

    > begin

    > ExStyle:=ExStyle or WS_EX_TRANSPARENT;

    > end;

    > end;

    >

    > procedure TRbsWiredEdit.DoExit;

    > begin

    > inherited;

    > FTransparent:=true;

    > SetCursor(0);

    > RecreateWnd;

    > end;

    >

    > procedure TRbsWiredEdit.DoEnter;

    > var exstyle,stdstyle:longint;

    > begin

    > inherited;

    > Ftransparent:=false;

    > StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);

    > exStyle:= StdStyle and not WS_EX_TRANSPARENT;

    > Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);

    > invalidate;

    > end;

    >

    > procedure TRbsWiredEdit.Invalidate;

    > begin

    > if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)

    > else inherited;

    > end;

    >

    > procedure Register;

    > begin

    > RegisterComponents('Rombest', [TRbsWiredEdit]);

    > end;

    >

    > end.

    >



    os에 제한은 없나요 ??

    win95/98/me 2000