Delphi重新创建画布

Delphi重新创建画布,delphi,canvas,Delphi,Canvas,我正在编写自己的组件,它有自己的画布。我创建了一个过程来重新创建控件的画布: procedure ClearCanvas; begin FreeAndNil(FCanvas); FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self; end; 新创建的画布运行良好,但旧画布仍在显示其内容 代码中有错误吗?! 感谢您显示的代码没有错误,它成功地创建了一个附加到控件的控件画布,并删除了旧的画布

我正在编写自己的组件,它有自己的画布。我创建了一个过程来重新创建控件的画布:

procedure ClearCanvas;
 begin
 FreeAndNil(FCanvas);
 FCanvas := TControlCanvas.Create;
 TControlCanvas(FCanvas).Control := Self;
 end; 
新创建的画布运行良好,但旧画布仍在显示其内容

代码中有错误吗?!
感谢您显示的代码没有错误,它成功地创建了一个附加到控件的控件画布,并删除了旧的画布

释放画布时,您看到的内容不会被清除,因为它不属于画布。VCL画布是一个易于使用底层操作系统图形功能的类。最终绘制的是为窗口检索的设备上下文。如果在您的案例中绝对有必要与实际画布进行类比,那么您必须摆脱控件的窗口(如果它是图形控件,则摆脱其父控件的窗口)以开始新的画布


你实际上要做的是删除内容。擦除并不是字面意义上的,它实际上是用任何被认为是初始状态的背景进行绘制。

我无法理解这个过程。只需调用
Invalidate
(或
Repaint
)方法,即可请求控件重新绘制。渲染本身在
Paint
方法中被覆盖。这不是答案,但你到底为什么要使用
FreeAndNil
?这不是绘画的工作方式。你只有在被要求时才能得到重新油漆。画布不保留任何状态。为了响应WM_油漆,在油漆周期内进行重新油漆。几乎可以肯定的是,这些代码应该被删除。这一定是错误的。重新创建画布对您没有帮助,它没有直接连接到设备上下文,而设备上下文也没有直接连接到显示表面。你走错了方向,你的方法是错误的。这是关键。重新创建画布没有任何用处。正如你所发现的。这是反复向你解释的。最终你接受了。谢谢你的详细回答,然后我应该检查Windows api参考,看看是否可以清除设备上下文,如果不可能,我将不得不重新创建它。@DrWael-不客气。没有API可以清除设备上下文,通常使用的是纯色填充。释放、检索设备上下文也无济于事,绘制的是DC所属的窗口。我想ResetDC可以完成这项工作,但没问题,我可以在标准tpicture属性编辑器中的Clear按钮的行为指导下重新构造组件。