1

我将图像绘制到画框的函数从 2 个位置调用,如果从 TPagecontrol pagechange 调用它可以正常工作,但如果从 form.formresize(….) 调用,图像被绘制,但随后画框被重新绘制变得完全变白。不知道这个恶行来自什么顺序——

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;
4

1 回答 1

7

您不能自己调用​​画框OnPaint事件处理程序。当你这样做时,油漆盒画布没有准备好。为了强制绘制框重新绘制,您需要调用InvalidateorRepaint方法。像这样:

PaintBox1.Invalidate;

或者

PaintBox1.Repaint;

调用Invalidate会导致异步重绘。控件被标记为,当消息队列下一次为空时,一条WM_PAINT消息被合成,控件将被重新绘制。

调用Repaint强制同步绘制周期。也就是说,将执行绘制,然后Repaint函数将返回。

除非你有特殊原因强制同步重绘,否则我建议你调用Invalidate.

@Sertac 在评论中建议您的绘画代码不在OnPaint处理程序中。如果真是这样,那就是更大的问题了。您必须将所有绘画代码放在附加到绘画框OnPaint事件的事件处理程序中。

于 2012-12-19T19:42:48.733 回答