首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子控件在调整TCustomControl后代的大小时闪烁

子控件在调整TCustomControl后代的大小时闪烁
EN

Stack Overflow用户
提问于 2016-06-28 20:55:03
回答 1查看 499关注 0票数 3

很长一段时间以来,我在我的应用程序中使用了TCustomPanel类的后代,称为MyContainer。我可以说是其他视觉控件的典型容器。一切都很好。有一天,我意识到我根本不使用面板功能,所以我可以直接从MyContainer派生TCustomControl

在这样做之后,当使用鼠标调整TMemo大小时,我遇到了子控件(例如对齐MyContainer )可怕的闪烁。这太可怕了--看起来整个TMemo都停了一会儿,这样我就可以看到背景了。MyContainer自己画得很好--这只是一个子控件的问题。

当MyContainer是从TCustomPanel中派生出来时,这种情况并没有发生。我错过了什么,在哪里?子控件是双缓冲的,MyContainer也是。我使用Delphi7PersonalEdition,所以我没有VCL源代码,所以我无法将TCustomPanel与TCustomControl实现进行比较。处理WM_EXITSIZEMOVEWM_ENTERSIZEMOVE消息(以启用/禁用子对齐)没有帮助。

我相信我的问题与擦除控制背景有关。作为对TCustomControl的“迁移”的一部分,我添加了以下代码来绘制方法:

代码语言:javascript
运行
复制
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);

如果没有此代码,子控件将不再闪烁,但父控件的绘制将被破坏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-29 00:14:27

影响这种行为的TCustomControlTCustomPanel之间的区别在于,TCustomPanel在构造函数中将csAcceptControls样式添加到ControlStyle中。这反过来又会影响TWinControl基类中的行为,后者将样式添加到具有该样式集的控件的窗口中。

因此,您可以通过以下两种方法中的一种实现相同的结果:

  1. 重写容器控件的csAcceptsControls构造函数,并将添加到容器控件的

  1. 重写CreateParams并直接将WS_CLIPCHILDREN标志添加到容器控件的窗口样式中。

“守则”

选项1:

代码语言:javascript
运行
复制
constructor TMyContainer.Create(Owner: TComponent);
begin
  inherited;
  ControlStyle := ControlStyle + [csAcceptsControls];
end;

请注意,这将意味着您的容器控件现在可以接受在设计时放置在它上的控件。即使没有此ControlStyle,也可以通过设置父属性在运行时向容器添加控件。

备选方案2:

代码语言:javascript
运行
复制
procedure TMyContainer.CreateParams(var aParams: TCreateParams);
begin
  inherited;
  aParams.Style := aParams.Style or WS_CLIPCHILDREN;
end;

这实现了绘画行为的特定变化,但不影响控件在设计时接受控件的能力。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38086143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档