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

ese*_*elk 2 delphi vcl builder

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

void __fastcall TForm1::WndProc(TMessage &Message)
Run Code Online (Sandbox Code Playgroud)

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

controls.pas中的此函数是DoubleBuffered应用的位置:

procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 5

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