2012-12-19 2 views
1

내 paintbox에 이미지를 페인트하는 기능은 2 곳에서 호출됩니다. TPagecontrol 페이지 변경에서 호출하면 제대로 작동하지만 form.formresize (...)에서 호출하면 이미지가 그려진 페인트 상자는 즉시 페인트 칠되어 완전히 흰 색을 띠게됩니다. 이 malefinction에서 오는 어떤 순서에서 어떤 생각 ---Paintbox 다시 그리기

procedure TForm.FormResize(Sender: TObject); 
begin 
    // frist image shown and then re painted white ??? 
    PaintImage2PaintBox(……….); 
end; 


procedure TForm.pgc_mainmenuChange(Sender: TObject); 
begin 
    // works fine as expected after pagecontrol tab change 

     PaintImage2PaintBox(……….); 
end;; 

procedure PaintImage2PaintBox(……….); 
begin 
     /// draw into a PaintBox 
end; 

답변

7

이없는 당신은 페인트 박스 OnPaint 이벤트 핸들러를 직접 호출 할 수 없습니다. 그렇게하면 페인트 상자 캔버스가 제대로 준비되지 않습니다. 페인트 상자를 다시 칠하도록하려면 Invalidate 또는 Repaint 메서드를 호출해야합니다. 이처럼 :

PaintBox1.Invalidate; 

또는 비동기 재 도장에서 Invalidate 결과를 호출

PaintBox1.Repaint; 

. 컨트롤이 더러움으로 표시되고 메시지 큐가 비어 있으면 WM_PAINT 메시지가 합성되고 컨트롤이 다시 칠합니다.

Repaint을 호출하면 동기식 페인트 사이클이 강제 실행됩니다. 즉, 페인트가 수행되고 Repaint 함수가 반환됩니다.

동기식 재 페인트를위한 특별한 이유가없는 한, Invalidate으로 전화하는 것이 좋습니다.

@Sertac은 회화 코드가 OnPaint 처리기에 없다는 의견을 제시합니다. 그렇다면 그것은 더 큰 문제입니다. 모든 페인팅 코드를 페인트 상자 OnPaint 이벤트에 첨부 된 이벤트 핸들러에 넣어야합니다.

+2

그리기 코드가 OnPaint에 있다고 생각하지 않습니다. –