Delphi / Builder / VCL,覆盖形式的WM_PAINT而不会丢失双缓冲?

时间:2012-02-28 17:21:20

标签: delphi builder vcl

我正在使用BCB6,但它应该与Delphi相同,如果我只是在我的表单中添加这样的处理程序:

void __fastcall TForm1::WndProc(TMessage &Message)

并且处理WM_PAINT,我没有得到TWinControl提供的DoubleBuffered的好处。有没有办法在表单上做一些自定义绘画,尊重DoubleBuffered设置(也就是写入TWinControl创建的内存位图)?

controls.pas中的这个函数是应用DoubleBuffered的地方:

procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

它创建一个内存位图,然后再次调用自身。所以当Message.DC为0时我需要一种方法来调用该函数,所以它会创建位图然后我不会再调用它...但是WMPaint不是虚拟的,也不是PaintHandler,所以我我没有办法搞定这个。

我知道我可以创建自己的双缓冲,但如果可能的话,我宁愿使用已经存在的东西。我计划将这种设计转移到其他控件上,而不仅仅是我的表格。

1 个答案:

答案 0 :(得分:5)

重写Paint方法,而不是尝试处理WM_PAINT条消息。这样,双缓冲的内置机制仍然是活动的,但您可以自定义您的绘画。