|
음..
보통 윈도우 어플리케이션에서 깜빡거림을 방지하기 위해서 더블버퍼링이라는것을 사용합니다.
더들버퍼링이란?
메모리DC에 그릴것을 모두 그린후에
윈도우DC에다가 메모리DC를 그대로 COPY하는방식이죠
TPaintBox는 GraphicControl입니다.
Bitmap에 모드 그린후에 PaintBox에 bitblt한다고 해서 더블버퍼링이 되는것은 아닙니다.
VCL에서는 TWinControl을 상속받은 모든 Control에서는
기본적으로 DoubleBuffering기능이 있습니다.
DoubleBuffered=true; 만 해주면 되죠
TPaintBox가 올려져 있는 곳이 Panel이 면 Panel의 DoubleBuffered를 true로 해줘야 합니다.
Panel1->DoubleBuffered=true; 이런식으로
Form의 OnCreate이벤트에 한줄만 코딩해주면 되죠
그럼..
이송화 님이 쓰신 글 :
: TPaintBox에 그린 그림이 깜빡이는 문제가 있어서 질문드립니다.
:
: 약 1초 마다 들어오는 GPS 데이터 수신시 위성 위치와 신호세기를 Bitmap에 그린 후 PaintBox의 OnPaint 이벤트핸들러에서 BitBlt 함수로 Bitmap의 내용을 PaintBox의 Canvas에 그리도록 했습니다.
: 한편, Bitmap에 그릴 때는 함수 내에서 생성한 임시 비트맵에 그린 후 그 내용을 OnPaint 이벤트핸들러에서 사용하는 Bitmap에 복사하도록 코딩했습니다.
:
: PaintBox1은 위성위치를 PaintBox2에는 신호세기를 그리는데 PaintBox1과 PaintBox2 모두 메인 폼의 왼쪽에 있는 Panel3에 있습니다.
:
: 메인폼의 WM_ERASEBKGND 메시지에서 배경을 지우지 않도록 해도 소용 없더군요.
:
: 그래서, Panel의 WindowProc를 제가 만든 함수로 바꿔서 조사해본 결과 알아낸 것은 Panel3 오른쪽 옆에 있는 Panel1에 WM_PAINT 메시지가 발생할 때 Panel3도 다시 그려지는 문제가 있더군요.
: 그래서, Panel3의 사용자정의 WindowProc 함수에서 WM_PAINT 메시지 도착시 Bitmap의 내용을 PaintBox로 BitBlt하고 Panel3->Dispatch()를 해주지 않았더니 깜빡이는 문제는 사라졌는데 옆에 있는 Panel1 위에 있는 것들이 지워지는 문제가 발생합니다.
:
: Panel1은 Panel3과 맞닿거나 겹쳐있지 않고 완전히 떨어져 있는 상태입니다.
: 두 Panel 모두 메인 폼에 직접 올려져 있는 것이구요 FullRepaint는 false로 설정해두었습니다.
:
: TPanel에 DoNotPaintClientArea와 같은 속성이 있어서 그 값이 ture면 테두리만 그리고 ClientArea는 손대지 않고 그대로 두는 기능이 있다면 깜빡임 문제는 없을 것인데....
:
: 깜빡임 문제를 어떻게 잡아야 하나요?
:
: 그림1은 디자인 타임 화면이고 그림2는 깜빡임 문제 해결 안한 실행화면입니다.
|