Q&A

  • 펜으로 그리기 기능 구현시...
그림판이나.. 포토샵을 보면.. Pen 으로 그리는 기능이 있는데..

그 기능을 구현하고자 해서. 아래와 같이 코딩했는데..

화면 깜박임이 심하네요...ㅠㅠ

무슨 다른 방법이 없을까여?

고수님들의 답변 부탁드립니당.


     case menu_kind of
          40 : begin  // Pen  
                    if shift = [ssLeft] then begin
                         TImage(Sender).Canvas.MoveTo(i_x,i_y);
                         TImage(Sender).Canvas.LineTo(x, y);
                         i_x := x;
                         i_y := y;
                    end;
               end;
     end;
4  COMMENTS
  • Profile
    서영대 2002.10.15 04:04
    doublebuffered
    로 검색해 보세요.

    팁에서 '더블버퍼'
    로 검색하시면 쪼금 다른 방법의 깜박임을 줄이는게 있습니다.

    --;
  • Profile
    김종화 2002.10.15 05:38
    답변 감사합니다... 더블버퍼를 true로 해서 해결했습니당..

    근데 하나 더 질문드릴게 있는데요..^^;;

    팁을 검색해보니 아래와 같은 글을 찾았는데요...

    메시지 가로채서 해결하는 방법이 있다고 하는데.. 이걸 어떻게 써머거야 되는질

    모르겠네요..ㅠㅠ

    이미지 그리는 폼에 아래 프로시저를 추가해놓기만 하면.될줄 알았는데.. 안되네요.ㅠㅠ

    좀 자세한 설명 부탁드립니당...^^;;

    ----------------------------------------------------------------------
    Name     안치봉  
    Subject [Tip] 이미지그릴때 깜박거림 없애기  

    예로 폼에 TImage 를 Align 을 alClient 로 주고 창을 여기저기로 드래깅하여 감추었다 보였다 하면 화면이 깜박거림을 알수 있습니다. 이게 어느때는 상당히 눈에 거슬릴때가 있죠.

    대부분의 분들이 이 현상(?)을 막기 위해서 더블버퍼링을 사용합니다. 하지만 그건 너무 초보적(?) 수단입니다. 크크.

    깜박임이 발생하는 이유는 폼이 회색으로 칠해지고 다시 이미지로 칠해지기 때문에 - 두번 칠해지기 때문입니다. - 한번만 칠해지게 하면 된다는 의미죠.

    TForm 의 속성에 보면 Color 라는 속성이 있고 그 값에 따라 폼에 색상이 변하는 것을 알수 있습니다. 그러면 TForm 은 WM_ERASEBKGND 메세지가 발생할때 Color 속성값으로 배경을 칠합니다.

    때문에 WM_ERASEBKGND 메세지를 가로(?)채면 간단히 해결됩니다.

    ...
    ...
    procedure TForm1.WMEraseBkgnd(var M: TMessage);
    begin
    M.Result := 1;
    end;

    이건 이미지를 그릴때 뿐만이 아니라 콤포넌트를 만들때도 하여튼 널리 사용할수 있습니다~



  • Profile
    홍성락 2002.10.15 10:26
    1.private에 선언하시구요
    private
        { Private declarations }
        procedure WMEraseBkgnd(var M: TWMEraseBkGnd); message WM_ERASEBKGND;
    2.몸체
    procedure TForm1.WMEraseBkgnd(var M: TWMEraseBkGnd);
    begin
        M.Result := 1;
    end;
    hsr////////////////////////////////////////////////////
  • Profile
    김종화 2002.10.15 19:31
    델마당에서 홍성진님이 올려주신 글을 봤는데요..

    제경우에는 더블버퍼 쓰는게 맞겠네요. 잔상이 남는 문제가 있어서요.ㅠㅠ

    그리구 답변 정말 감사드립니당 ^^

    ------------------------------------------------------------------
      작성자   : 홍성진 (sjhong88@intizen.com)  조회: 23, 줄수: 135, 분류: Etc.  
    [답변] 펜으로 그리기 기능 구현시...  
    이걸 쓰시면, 잔상이 남습니다. 저기 안치봉 님이 말씀하신것도 일리가 있는데요..

    이게 완전 사각형의 이미지로 폼을 모두 그릴때의 경우지, 펜을 쓰거나 할때에는...

    써먹을수 없습니다. 왜냐면 배경 색칠을 안하기 때문에 뒤에 있는 프로그램이나 배경이

    잔상이 남게 됩니다. 뭐 하여튼 한번 구경이나 해보심이 -_-);;

    TForm1 = class(TForm)
    private
       procedure WMEraseBkgnd(var M: TMessage); message WM_ERASEBKGND; //<-- 요기다가 선언을 해두셔야합니다..
       { Private declarations }
    public
       { Public declarations }
    end;

    요기에 저 한줄을 추가하시면 됩니다. 님 프로그램에서 추가하시면 제데로 동작할겁니다.

    다만... 님이 원하시는 기능은 구현 안될겁니다. 더블버퍼링이 이경우에 쓰이는거죠..

    백버퍼를 만들고 그리기 전에먼저 다 그려놓고 메모리에 빠르게 쓰기때문에 깜박임이

    없는겁니다 ^^ 그럼.

    안치봉님이 말씀하신건, 배경 칠한뒤에 다른거 칠하기 땜에 깜박임이 남으로, 배경 색칠

    을 안해버리는 경우인데, 이건 이미지가 폼에 꽉차거나 할때에나 쓰일수 있으니 참고하세용 -_-);;