我曾经在我的应用程序中使用TCustomPanel
类的后代,称为MyContainer,作为其他可视控件的典型容器。这样做一直很好。有一天我意识到我根本没有使用面板功能,因此我可以直接从TCustomControl
派生 MyContainer。
但是,这样做后,当通过鼠标调整MyContainer的大小时,子控件(例如对齐的TMemo)会出现可怕的闪烁。情况非常糟糕 - 看起来整个TMemo正在消失,以至于我可以看到背景。MyContainer自己绘制得很好 - 这只是子控件的问题。
在MyContainer从TCustomPanel派生时,这种情况并未发生。我错过了什么?子控件是双缓冲的,MyContainer也是。由于我使用的是Delphi 7 Personal Edition,所以我没有VCL源代码,因此无法比较TCustomPanel和TCustomControl的实现。处理WM_EXITSIZEMOVE
和 WM_ENTERSIZEMOVE
消息(以启用/禁用子对齐)没有帮助。
我相信我的问题与擦除控件背景有关。作为迁移到TCustomControl的一部分,我将以下代码添加到Paint方法中:
Canvas.Font.Assign(Font);
Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := Color;
PatBlt(Canvas.Handle, Canvas.ClipRect.Left, Canvas.ClipRect.Top, Canvas.ClipRect.Right, Canvas.ClipRect.Bottom, PATCOPY);
没有这段代码,子控件不再闪烁,但父控件的绘制被破坏。