2010-04-10 2 views
3

3 개의 데이터 그래프가 페인트 이벤트를 통해 그려집니다. 그래프에 삽입해야하는 데이터가있을 때 컨트롤 invalidate()를 호출합니다.주기적인 정상 작업 (런타임) 이후의 변경된 Onpaint 이벤트 (무효화)

첫 번째 컨트롤의 페인트 이벤트는 실제로 긴 루프를 반복하지 않도록 다른 두 그래프의 비트 맵 버퍼를 만듭니다.

따라서 invalidate 명령은 특정 순서 (1,2,3)로되어 있습니다. 이것은 잘 작동하지만, 그래프 데이터가 그래프 창 (PictureBox)의 끝에 도달하여 데이터가 정상적으로 스크롤되기 시작하면 페인트 이벤트가 잘못된 순서 (2,3,1)로 시작됩니다.

누구나 전에이 문제가 발생 했습니까? 왜 이런 일이 일어날 수 있겠습니까?

+0

@ 루크 : 제목에 언어를 넣을 필요는 없습니다. 태그에 넣었으니 말입니다. 또한 "안녕"이라고 말할 필요도 없습니다. 우리는 대화가 없기 때문에 Q & A를하고 있습니다. http://stackoverflow.com/faq를 참조하십시오. –

답변

5
는 세 가지 컨트롤의에 Invalidate를 호출하기 전에, 당신이 (생각할 컨트롤 클래스의 정적 멤버와 같은) 하나의 공유 비트 맵 버퍼를 생성하도록 코드를 변경하고 각 컨트롤에 다음 전화 Invalidate

. 컨트롤의 Paint 이벤트 내에서 정적 비트 맵 버퍼를 사용할 수 있으며 Paint 이벤트가 발생하는 순서는 중요하지 않습니다.

컨트롤에 Invalidate을 호출하면 기본적으로 해당 컨트롤에 WM_PAINT 메시지를 보내도록 OS에 지시하고 있습니다. Windows 메시지이므로 Windows가 작업을 수행 할 때마다 배달된다는 보장이 있습니다. 귀하의 경우, 그들은 보통 수령 한 순서대로 배달되지만 때로는 그렇지 않을 수도 있습니다.

코드와 함께 고려해야 할 또 한가지 : 당신이 당신의 컨트롤의 Paint 이벤트 핸들러 내부에 상대적으로 복잡한 그리기 코드를 배치 할 때 컨트롤이 를 무효화 될 때마다 (또는 Paint 이벤트 처리기에서 직접 호출하는 방법 내부),이 코드가 실행 어떠한 이유로 든 Invalidate을 호출 할 때 코드가 실행되지만 다른 윈도우가 컨트롤 위로 끌릴 때마다 코드가 실행됨을 의미하는입니다. 복잡하고 시간이 많이 소요되는 그래픽

, 그것은 숨겨진 버퍼 (A Bitmap 또는 보이지 않는 PictureBox 또는 무엇이든)에 복잡한 렌더링을 수행하기 위해 항상 최선의 다음 컨트롤의 Paint 이벤트에 숨겨진 버퍼에서 간단한 복사를 할 (Graphics.DrawImage 또는 BitBlt 또는 무엇이든 사용).

이 방법을 사용하면 그리는 버퍼와 보이는 창 사이에 두 번째 버퍼를 추가하면 (따라서 "이중 버퍼링") 깜박임을 피할 수 있습니다. 주 버퍼에서 그리기를 완료 한 후에는 두 번째 버퍼에 복사합니다. 컨트롤의 Paint 이벤트에서 두 번째 버퍼에서 보이는 창으로 복사합니다.

+0

미안하지만, 내 잘못이야. 나는 타임 스탬프를 보지 않았다. 게시물은 내가 진드기를 만들 때 게시 순서로 표시되지 않았습니다. 교훈은 –

+0

을 배웠습니다 @ 루케 : Virtlink에 수표를 돌려 줄 수 있습니다 - 나는 많은 포인트를 얻었고 그는 옳았습니다. :) – MusiGenesis

3

컨트롤의 Invalidate() 호출은 기본적으로 운영 체제에 다시 그리기 컨트롤을 예약하도록 요청하기 때문에 특정 순서로이 작업이 수행된다고 보장 할 수 없습니다.

Invalidate()을 특정 순서로 호출하려고 했으므로이 작업을 수행하는 단일 방법이 있다고 가정합니다. 이러한 호출 바로 전에 코드를 추가하여 무효화 된 컨트롤에서 사용하는 비트 맵 버퍼를 그릴 수 있습니다. 이것이 일어날 지 모르지만 데이터의 변경이 없을 때 컨트롤을 무효화 할 수있는 자유를줍니다. 또한 언제든지 컨트롤을 무효화 할 수 있습니다. 예를 들어 컨트롤 1에서 폼을 이동하면 폼이 무효화되고 현재 설정에서 버퍼 비트 맵을 다시 계산해야하는 반면 필요하지는 않습니다. 따라서이 기능을 분리해야합니다.

+0

나는 맥주가 차기를 기다리는 동안 잠시 우는 소리를한다. 이것은 정확하게 5 분 일찍 말한 것입니다. :) – MusiGenesis

관련 문제