2013-08-07 6 views
1

그래프를 그리고 그 가운데에 사각형을 칠하고 싶습니다. 델파이 7 사용 , 다음과 같이 완료되었습니다 끔찍한 깜박임의 원인번쩍임없이 사각형에 Repaint 직사각형, Windows 7, Delphi

with graphform.canvas do begin 
    brush.color:=clwhite; 
    brush.style:=bssolid; 
    pen.color:=clwhite; 
    rectangle(1,y0,639,y0-341); 
end; 

//short wait while other things happen 

graphform.waitlab.Invalidate; 

: 흰색 사각형 세척 멀리 waitlab는 다음 짧은 대기 후, waitlab가 다시 그려진다. waitLab은 큰 필드의 가운데에있는 작은 사각형입니다.

창 그림을 해제해도 창이 전혀 그려지지 않습니다. 윈도우 페인팅을 끄고 다시 켜서 창을 다시 채우면 나는 원래의 문제가 있습니다. 나는 흰색 사각형에 페인팅을하고 색을 칠합니다.

흰색 필드가 Delphi 컨트롤이 아니기 때문에 페인트 이벤트 핸들러에서 캔버스 코드가 실행되고 실행되어야합니다. 폼에 대한 모든 페인트 메시지에 명시 적으로 다시 그려야합니다. waitlab은 무효화 된 후에 델파이가 다시 칠하는 델파이 컨트롤입니다. 무효화 코드 행은 페인트 이벤트 핸들러에 없습니다. 즉, 긴밀한 루프가 발생합니다.

BUT 코드도 양식에 그려진 다른 것들을 변경하는 통신 이벤트에서 비동기 적으로 실행되며이 페인팅 코드를 직접 호출합니다.

기술 솔루션이 있는지 또는 프로그램 논리에 대한 해결책이 있는지 알 수 없습니다. 너는 무엇을 제안 하는가?

+0

이 코드의 컨텍스트는 무엇입니까? WM_PAINT 이벤트에 응답하여 실행 중입니까? 그리고 그렇지 않다면 왜 안됩니까? –

+0

위의'with' 블록과 같은 그림 코드는'WM_PAINT' 메시지, 즉'OnPaint' 핸들러에 응답하여 실행되어야합니다. 나는 또한 그것이 나의 대답의 경우라고 생각한다. –

+0

'다른 일이 생길 때까지 잠시 기다려주십시오'하면 어떻게됩니까? –

답변

1

Invalidate 대신 InvalidateRect을 사용하십시오.

InvalidateRect을 사용하면 캔버스에 특정 사각형을 다시 칠하도록 Windows에 지시 할 수 있습니다. 이 경우 Rect(1,y0,639,y0-341)입니다.

+0

작은 사각형을 이미 무효화했습니다. 큰 직사각형 (1, y0,639, y0-341)에 의해 씻겨 졌기 때문에 그렇게합니다. – david