我想画一个图,并在它的中心画一个矩形。使用 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 事件上异步运行,该事件会更改在表单上绘制的其他一些内容,并直接调用此绘制代码。
不知道有没有技术方案,或者程序逻辑有没有解决方案。你有什么建议?