|
외랑 님이 쓰신 글 :
: 안녕하세요...
:
: Tracker를 구현하려고 TGraphicControl로 부터 상속을 시켜서
: TRegion이란 걸 만들었습니다.
: 그림처럼 마우스 드래그로 생성이 되면서 TRegionManager라는 이름의 TList구조를 2개(타입이 2가지) 가지고 있는
: 관리를 목적으로 하는 클래스에 등록이 됩니다. (Active 된 것만 지우거나 전체를 지울 필요성이 있어서... Manager가 필요하게 되어서)
:
: 이렇게 여러개의 Region이란 걸 드래그로 만들면서 도중에 리페인트 요구가 생기게 되는데,
: 이때 TControl에 있는 Invalidate()와 Refresh(), Repaint() 중 어떤게 제일 적합할까요...
: 마우스로 드래그하는 중에 사각형의 컨트롤이 커지면서 내부, 외부가 지워지게 되는데...
:
: 차이와 설명을 좀 부탁 드립니다...
: 그럼 모두 즐프, 즐공 하시길 바랍니다.
홍환민.행복 님이 작성하신 Tip'N Tricks 의 깜박임을 물리치자 라는 게시물을 참조하시기 바랍니다.
(다른 팁들도 참고하시란 의미에서 링크는 걸지 않겠습니다)
Invalidate 는 GDI 가 수합하여 처리할 수 있도록 이벤트를 남겨주는 역할을 하며, 그 시점에서
즉시 갱신되진 않습니다. 대부분의 경우 여러개의 컨트롤이 각자 그려진다고 가정할 때
그려질 영역을 GDI에 통보하는 정도로써는 Invalidate 가 적절합니다.
즉시 변경이 적용되어야 하는 경우에나 Refresh, Repaint 를 사용하게 되죠. Refresh 역시 Repaint를
호출하게 되는데, 자세한 것은 도움말을 참고하시구요.
또 한가지, 더블 버퍼링 등의 다른 기법을 사용하지 않은채 컨트롤을 자작하셔서 화면에 뿌리시는 경우
드로잉 함수들이 서로의 영역을 침범하지 않게 하시는게 좋습니다.
예를 들어 [검정 [회색 ]검정 ] 이런 사각형을 그리신다면,
함수 호출을 줄여 보겠다고, 검정 사각형을 깔고 그 위에 회색 사각형을 그리게 되기 쉬운데,
검정이 그려지고 회색이 그려지는 부분이 점멸하게 되더군요. [검정 ][회색 ][검정 ] 이렇게
셋으로 나눠 그리시는게 보다 컴퓨터의 작업량도 줄이고, 화면 갱신시의 번쩍임도 감소시킬 수 있습니다.
(사각형이 너무 작아져 버리면 또 그렇지 않은 경우도 생기겠지요... GDI 호출은 호출 횟수의 영향도 크게
받으니까요)
|