|
맨날 질문만 올리고.. ^^ 별로 아는것도 없지만..
그래도 제가 경험해본 문제를 해결한것이 있어서
이 볼랜드포럼에서 조금이나마 다른분들에게도 도움이 되고 싶어서 올리네요
1. 깜박거리는 현상은 Double Buffering 기법을 쓰시면 매우 부드럽게 움직일 수 있습니다.
g_hBuffer = CreateCompatibleDC(pPaint->Canvas->Handle);
한다음 실제로 보여줄 부분만 버퍼에 그린후 한꺼번에 Bitblt를 이용해서 다시 pPaint->Canvas->Handle로 한꺼번에 뿌려주는것이죠.
근데 실제로 보여줄 부분만 뿌리기에는 여러가지 제약이 있습니다.
빌더에서 제공되는 TScrollBox를 이용할때는 보여지는 부분만 다시 그리는것이 아니라
감추어진 영역까지 전체를 다시 Paint하기 때문에 완벽한 Viewer역할을 하기 어려운것이죠
그래서 대부분의 이미지 뷰어들은 ScrollBox가 아예없고, 마우스로 드래그 하여 이미지를
스크롤 합니다.
예를 들어 TScrollBox안에 PaintBox를 넣고
TScrollBox의 크기가 500x500 이라 하고
보여줄 이미지 즉 TPaintBox Size가 1000x1000이라 할때
Repaint를 할 때 1000x1000만큼 다시 그려줘야 하기때문에 Double Buffering을 했다 하더라도,
깜박거리진 않아도 이미지가 기어가는 듯한 현상이 나타날 수 있습니다.
2. 빠르고 부드럽게 스크롤 박스를 이용 할 수 있는 방법은
TPanel위에 TPaintBox의 크기를 500x500을 놓고
TPanel에는 Panel1->DoubleBuffered = true, Panel1->FullRepaint = false 를 해줘야 합니다.
그리고 TScrollBox가 아닌 TScrollBar를 Vertical 형태로 Panel1 오른쪽에 붙이고
Panel2하나를 더 생성해서 Panel1 아래에 배치합니다.
Panel2에는 TScrollBar를 Horizontal 형태로 Client Align으로 넣어준후 TBevel을 Space 옵션을 주어서 오른쪽에 17x17의 크기로 배치하면 TScrollBox처럼 보이죠
그 다음에 각 스크롤바에 MAX값은 이미지의 Width, Height값을 넣어주면되고,
GetSystemMetrics 를 이용하여 ScrollBar의 PageSize를 계산하고,
실제로 보여주는 RECT 좌표에 따라 스크롤바도 연동시켜 움직여주면 완벽한 뷰어가 된답니다.
이 방법 말고도 다른 고수님들은 더 좋은 방식으로 개발하신분들도 많을테죠 ^^
그래도 제가 해본바 무쟈게 부드럽고 잘 돌아갑니다 ^^
아담 님이 쓰신 글 :
: 이미지 컴포넌트가 그래픽 작업시 깜박꺼림방지및 기타 좀 편하긴한데 저사양 그래픽카드에서
: 속도가 좀 떨어지는군요.
:
: 최근 그래픽 보통사양에서는 속도차이는 못느끼는데 구형 램2메가 에서는 차이가 많이 나는군요.
:
: 구형 저램 그래픽카드에서 그래픽 처리하시는 프로그램 작성하시는 분은 이미지 컴포넌트보다는
:
: 페인트박스를 이용하시는것이 좋을듯하네요 속도가 훨씬 빠름니다.
:
: 그러나 전체화면 다시 그릴때 깜박이는 현상은 처리하기가 까다로운듯...
:
: 제가 테스트한결과입니다. 고사양 그래픽 카드에서는 차이 못느낌니다.
:
: 그럼 좋은 하루 되시길 바라며...
:
|