1

我想画一个图,并在它的中心画一个矩形。使用 Delphi 7,它是这样完成的:

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 是一个 Delphi 控件,Delphi 在失效后重新绘制。无效代码行不在绘制事件处理程序中:这将导致紧密循环。

但是代码也在 comm 事件上异步运行,该事件会更改在表单上绘制的其他一些内容,并直接调用此绘制代码。

不知道有没有技术方案,或者程序逻辑有没有解决方案。你有什么建议?

4

1 回答 1

1

使用InvalidateRect而不是Invalidate.

使用InvalidateRect,您可以告诉 Windows 仅在画布中重新绘制特定的矩形。在这种情况下,Rect(1,y0,639,y0-341)

于 2013-08-07T10:13:42.353 回答