将图像绘制到绘图框中的函数从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;
答案 0 :(得分:7)
您无法自己调用绘图框OnPaint
事件处理程序。当您这样做时,油漆盒画布没有正确准备。为了强制绘制框重新绘制,您需要调用Invalidate
或Repaint
方法。像这样:
PaintBox1.Invalidate;
或
PaintBox1.Repaint;
调用Invalidate
会导致异步重绘。控件被标记为 dirty ,当消息队列接下来为空时,将合成WM_PAINT
消息,并重新绘制控件。
调用Repaint
强制执行同步绘制循环。也就是说,将执行绘制,然后Repaint
函数将返回。
除非您有特殊原因强制进行同步重绘,否则我建议您致电Invalidate
。
@Sertac在评论中建议您的绘画代码不在OnPaint
处理程序中。如果是这样那么这就是一个更大的问题。您必须将所有绘制代码放在附加到绘图框OnPaint
事件的事件处理程序中。