Q&A

  • Invalidate에 관하여
컴포넌트를 만드는 중에 Invalidate라는 프로시저가 나와서 궁금해서 글을 올림니다. 이 프로시저의 역할을 무엇이고 또한 다른 책을 보면 Update라고 나온곳도 있던데 둘의 차이점은 무엇인지요...
그리고 , 지금 제가 만드는 컴포넌트에는 Uses에 controls가 포함이 되어 있는데도 Invalidate 프로시저를 찾지를 못합니다. 이것은 또 무엇때문인지요...


답변 해 주시면 정말 감사하겠습니다.
1  COMMENTS
  • Profile
    하얀까마귀 2002.01.24 03:19
    안녕하세요 하얀까마귀 입니다.

    간단하게만 말씀드릴께요..

    이건 델파이 보다는 API와 관련이 있습니다. 윈도우즈에 대해 공부하시면

    쉽게 이해가 되실껍니다..

    결론부터 말씀드리면 둘다 윈도우를 다시 그리는 겁니다.

    WM_PAINT 메세지와 관련이 있는거구요...

    우선 Update 이건 실제적으로 UpdateWindow 라는 API를 실행하는겁니다.

    이 API 는 윈도우의 Client 영역에 대해서 WM_PAINT 메세지를 발생시킵니다.

    그러니까 클라이언트 전체 영역에 대해서 다시 그려주게 됩니다.

    그리고 Invaildate 이건 Delphi가 갖고 있는 함수이고.. 이넘은 약간 다릅니다.

    소스를 보시면.
    procedure TWinControl.Invalidate;
    begin
      Perform(CM_INVALIDATE, 0, 0);
    end;

    procedure TWinControl.CMInvalidate(var Message: TMessage);
    begin
      if HandleAllocated then
      begin
        if Parent <> nil then Parent.Perform(CM_INVALIDATE, 1, 0);
        if Message.WParam = 0 then
          InvalidateRect(FHandle, nil, not (csOpaque in ControlStyle));
      end;
    end;

    자신에겐 InvalidateRect 를 발생시키고.. ( WParam = 0 )이니까.
    부모에게 보낸메세지에는 wParam이 1로 되어 있죠..

    여기서 중요한건 InvalidateRECT입니다.
    이메세지의 마지막인자가 True 이면 두번째인자의 영역이 무효화되고 배경을 지우게 되고 False이면 지우지 않습니다.

    두번째 인자가 nil이면 전체영역을 뜻하는거구요.

    그러니까 부모에게 무효화 되었다고 메세지를 보내고.

    자신의 속성중에 csOpaque가 없으면 다시 그리는겁니다.

    그런데 invalidate를 찾지 못하는건 잘 모르겠네요..

    아마 TWincontrol에 정의되어 있을텐데.. 왜 못찾는다고 말씀을하시는건지..

    그럼. 즐거운시간 되세요.

    - 하얀까마귀 -