【问题标题】:Delphi/Builder/VCL, Override WM_PAINT of form without losing double-buffering?Delphi/Builder/VCL,在不丢失双缓冲的情况下覆盖表单的 WM_PAINT?
【发布时间】:2012-02-28 17:21:20
【问题描述】:

我使用的是 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 也不是,所以我我没有找到一种方法来解决这个问题。

我知道我可以创建自己的双缓冲,但如果可能的话,我宁愿使用已有的。我还计划将此设计应用于其他控件,而不仅仅是我的表单。

【问题讨论】:

  • Delphi7 中的表单(在 BCB 上不确定)有一个 OnPaint 事件,但它没有缓冲,您仍然需要使用简单的 TBitmap 自己完成。

标签: delphi builder vcl


【解决方案1】:

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

【讨论】:

  • 天啊,真不敢相信我错过了。现在效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
相关资源
最近更新 更多