는 세 가지 컨트롤의에
Invalidate
를 호출하기 전에, 당신이 (생각할 컨트롤 클래스의 정적 멤버와 같은) 하나의 공유 비트 맵 버퍼를 생성하도록 코드를 변경하고 각 컨트롤에
다음 전화
Invalidate
. 컨트롤의 Paint
이벤트 내에서 정적 비트 맵 버퍼를 사용할 수 있으며 Paint
이벤트가 발생하는 순서는 중요하지 않습니다.
컨트롤에 Invalidate
을 호출하면 기본적으로 해당 컨트롤에 WM_PAINT 메시지를 보내도록 OS에 지시하고 있습니다. Windows 메시지이므로 Windows가 작업을 수행 할 때마다 배달된다는 보장이 있습니다. 귀하의 경우, 그들은 보통 수령 한 순서대로 배달되지만 때로는 그렇지 않을 수도 있습니다.
코드와 함께 고려해야 할 또 한가지 : 당신이 당신의 컨트롤의 Paint
이벤트 핸들러 내부에 상대적으로 복잡한 그리기 코드를 배치 할 때 컨트롤이 를 무효화 될 때마다 (또는 Paint
이벤트 처리기에서 직접 호출하는 방법 내부),이 코드가 실행 어떠한 이유로 든 Invalidate
을 호출 할 때 코드가 실행되지만 다른 윈도우가 컨트롤 위로 끌릴 때마다 코드가 실행됨을 의미하는입니다. 복잡하고 시간이 많이 소요되는 그래픽
, 그것은 숨겨진 버퍼 (A Bitmap
또는 보이지 않는 PictureBox
또는 무엇이든)에 복잡한 렌더링을 수행하기 위해 항상 최선의 다음 컨트롤의 Paint
이벤트에 숨겨진 버퍼에서 간단한 복사를 할 (Graphics.DrawImage
또는 BitBlt
또는 무엇이든 사용).
이 방법을 사용하면 그리는 버퍼와 보이는 창 사이에 두 번째 버퍼를 추가하면 (따라서 "이중 버퍼링") 깜박임을 피할 수 있습니다. 주 버퍼에서 그리기를 완료 한 후에는 두 번째 버퍼에 복사합니다. 컨트롤의 Paint
이벤트에서 두 번째 버퍼에서 보이는 창으로 복사합니다.
@ 루크 : 제목에 언어를 넣을 필요는 없습니다. 태그에 넣었으니 말입니다. 또한 "안녕"이라고 말할 필요도 없습니다. 우리는 대화가 없기 때문에 Q & A를하고 있습니다. http://stackoverflow.com/faq를 참조하십시오. –