Q&A

  • 투명윈도우에서 컴포넌트를 움직이면 나오는 잔상을 지우려면..
폼을 투명하게 하고 라인을 시간에 따라 이동시키면 라인이 이동하기 시작한때로부터 계속 잔상이 남습니다. 잔상을 지우려면 어떻게 해야 하는지요?

폼을 투명하게 하지 않을때는 잔상이 남지 않는데 투명하게 할때 이런 문제가 발생합니다. 잔상을 없애는 방법을 애타게 찾고 있습니다. 도와주세요..꾸벅!~

폼을 투명하게 설정:
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Brush.Style := bsClear;
Form1.BorderStyle := bsNone;
end;

라인을 0.1초마다  이동
procedure TForm1.Timer1.Timer(Sender: TObject);
begin
Line.Left:=Line+10;
lb.Caption:=IntToStr(Line.Left);
end;


4  COMMENTS
  • Profile
    구창민 2003.01.08 01:36
    안녕하세요~ 구창민입니다.

    원하시는게 아래가 맞는지 한번 테스트 해보세요.

    빈폼에 버튼 하나와 타이머 하나 올리시고 테스트 하심 됩니다.

    그럼~ 항상 즐거운 프로그래밍 하시구요~


    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        lb: TLabel;
        Timer1: TTimer;
        Line: TPanel;
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure FormRepaint;
      end;

    var
      Form1: TForm1;
      Line : integer;
    implementation

    {$R *.DFM}

    procedure TForm1.FormRepaint;
    var
       FullRgn, ClientRgn, ButtonRgn: THandle;
       Margin, X, Y: Integer;
    begin
       Margin := (Width - ClientWidth) div 2;
       FullRgn := CreateRectRgn(0, 0, Width, Height);
       X := Margin;
       Y := Height - ClientHeight - Margin;
       ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
       CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
       X := X + Button1.Left;
       Y := Y + Button1.Top;
       ButtonRgn := CreateRectRgn(X, Y, X + Button1.Width, Y + Button1.Height);
       CombineRgn(FullRgn, FullRgn, ButtonRgn, RGN_OR);
       SetWindowRgn(Handle, FullRgn, True);
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Button1.Left := Button1.Left + 10;
      FormRepaint;
    end;

    end.



  • Profile
    한태수 2003.01.08 02:57
    구창민님 답변 감사합니다.

    님께서 적어주신 방법을 알고 있습니다만 클립핑하지 않고 폼의 영역(크기)을 유지하면서 폼의 배경을 투명으로 하고 폼위에 라인을 타이머의 진행에 따라 왼쪽으로 이동시킬때 잔상 문제가 해결이 되지 않아 애가 탑니다.

    더우기 실행할때 다른 왼도우를 띄우면 다른 윈도우의 잔상이 겹쳐지는 현상이 발생합니다.

    아래의 소스를 올립니다. 여기에 맞는 도움을 주시면 감사하겠습니다.



    type
      TForm1 = class(TForm)
        Button1: TButton;
        Line: TShape;
        Timer1: TTimer;
        lb: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Form1.Brush.Style := bsClear;
    Form1.BorderStyle := bsNone;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Timer1.Enabled:=true;
    end;

    procedure TForm1.tmTimer(Sender: TObject);
    begin
    Line.Left:=Line.left+10;
    lb.Caption:=IntToStr(Line.Left);
    end;

    end.
  • Profile
    남양원 2003.01.08 23:55
    procedure TForm1.tmTimer(Sender: TObject);
    begin
    Line.Pen.Color := clWindow;
    Application.ProcessMessages;
    Line.Left:=Line.left+10;
    Line.Pen.Color := clBlack;
    lb.Caption:=IntToStr(Line.Left);
    Application.ProcessMessages;
    end;

    이동전 Line의 테두리부분의 색깔을 clWindow로 바꾸고 나서

    화면 처리를 위해 Application.ProcessMessages 를 날리고

    다시 Line의 테두리 부분의 색깔을 원래 색상대로 변경해 준거져
    (저는 원래 clBlack으로 했거든요)

    여기서 Line.Brush.Color도 마찬가지로 위와 같은 방법으로 하면
    될꺼 같네여....

    그럼... 허접이...





  • Profile
    남양원 2003.01.09 00:00
    허걱....

    아까 잘되길래 Brush 색상에 대해서도 해봤는데...

    폼 바탕화면에 대해서는 처리가 안되네여....

    ㅜ.ㅜ 역쉬 허접했음을 스스로 깨닫는 순간입니다....

    이만...휘~리~릭~!