重绘一个Paintbox不起作用

时间:2012-12-19 19:39:17

标签: delphi

将图像绘制到绘图框中的函数从2个位置调用,如果从TPagecontrol页面调用调用它可以正常工作,但是如果从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;

1 个答案:

答案 0 :(得分:7)

您无法自己调用绘图框OnPaint事件处理程序。当您这样做时,油漆盒画布没有正确准备。为了强制绘制框重新绘制,您需要调用InvalidateRepaint方法。像这样:

PaintBox1.Invalidate;

PaintBox1.Repaint;

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

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

除非您有特殊原因强制进行同步重绘,否则我建议您致电Invalidate

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