C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40493] Re:Tracker구현 중에 의문이 생겨서...
열씸! [cappuccino] 899 읽음    2005-06-10 07:27
외랑 님이 쓰신 글 :
: 안녕하세요...
:
: 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 호출은 호출 횟수의 영향도 크게
받으니까요)

+ -

관련 글 리스트
40482 Tracker구현 중에 의문이 생겨서... 외랑 753 2005/06/09
40496     답변에 감사 드립니다 *^^* (내용없음) 외랑 783 2005/06/10
40493     Re:Tracker구현 중에 의문이 생겨서... 열씸! 899 2005/06/10
40485     Re:Tracker구현 중에 의문이 생겨서... 소리바람.OJ 922 2005/06/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.