【问题标题】:Parent/Child relationship with TControl与 TControl 的父/子关系
【发布时间】:2010-07-24 01:46:38
【问题描述】:

我想用 TControl 实现父/子关系,我的意思是能够有一个 TControl 可以作为另一个 TControl 的容器。 据我所知,您只能使用 TWinControl 做到这一点,这是为什么呢?以及如何让它为 TControl 工作?

【问题讨论】:

  • 为什么要 TControl 生孩子? TWinControl 就是为此目的而设计的。
  • 我想做这个:img688.imageshack.us/img688/8610/76990692.png,我已经通过离开 TControl/TWinControl 来做到这一点。您在屏幕截图中看到的是 3 个面板,左侧是顶部,不透明度为 150,右侧在背面,中间在中间,显然,每个面板的不透明度为 50。除了背景(在应用程序启动时组成)之外的所有内容都是实时绘制的。它们融合在一起 + 无闪烁 + 动画速度足够快(您在屏幕截图中看不到),并且可能在其他平台上与 Lazarus 一起使用。是的在德尔福:)

标签: delphi vcl


【解决方案1】:

您需要 TWinControl 来提供绘图上下文(句柄)并因此来绘制控件。这就是 Windows 的工作原理。

VCL 允许没有句柄的控件;这些控件从其父级获取句柄。 VCL就是这样设计的。

理论上,您可以设计一个库(VCL 替换或增强),它不需要 TWinControl 作为父级的 TControl,但您仍然需要以某种方式(从某些 TWinControl)获取句柄来绘制没有句柄的 TControl。我认为这种方法没有任何好处,只会让事情变得更复杂。

【讨论】:

  • 确实,我有一个基本容器,它是 TWinControl 的后代,包含我的控件(TControl 的后代),它们模仿标签、编辑、按钮、复选框等控件。基本容器 (TWinControl) 绘制背景和然后里面的控件,模拟焦点事件和击键。它工作得很好,UI 看起来很棒(alpha 混合、抗锯齿曲线边框等),它速度很快,最重要的是无闪烁,尽管在当前状态下缺少很多功能。我可以从头开始做一些东西,但我必须实现锚支持等。
  • @pani - 我认为从头开始重新实现 VCL 功能并不是一个好主意。即使你成功了,你最终也会头疼——例如,更新你的组件以使用更新的 VCL 版本将(可能)是一个问题。请注意,VCL 本身尽可能包装标准 Windows 控件,而不是从头开始设计控件。
  • 谢谢 Serg,您的发言让我意识到,使用 TControl(或 TWinControl)来实现我的想法可能会导致您提到的未来问题。
【解决方案2】:

您的意思是希望能够将一个控件放置在表单上的另一个控件中,例如将按钮放置在面板或组框上?如果是这样,那么您只能对 TWinControl 后代执行此操作是有原因的。父级由 Windows 处理,而不是由 VCL 处理,为了做到这一点,您需要一个具有 HWND 窗口句柄的控件。这是 TWinControl 的显着特征:它有一个窗口句柄,而其他 TControl 后代则没有。

【讨论】:

  • 据我所知,VCL 可以与具有窗口句柄的控件和没有窗口句柄的控件一起使用。我相信按照设计,您只能将 TWinControl 作为 TControl 的父级。我想克服这个限制。
【解决方案3】:

要托管其他控件,您的容器需要有一个窗口句柄。这主要是因为每个窗口控件都需要有一个父窗口。为了避免这种限制,您可能可以一起破解某些东西,以便您的容器只能接受 TGraphicControl 后代作为子项,但我认为 IDE 已经“知道”只有 TWinControls 可以保存其他控件,因此您将与之抗争.特别是,IDE 会想要分配孩子的 Parent 属性,但不会有任何东西可以分配给它。

另一方面,如果你给一个 TControl 一个窗口句柄,你也可以只拥有一个 TWinControl。

【讨论】:

  • 我总是可以在运行时创建控件。问题是如何做到这一点......
【解决方案4】:

TWinControl 有它自己的屏幕可供绘制(由操作系统提供)。非 Win TControl 不会,它会在父级的上下文中进行绘制。因此只有 TWinControl 可以作为父级,使用它而不是 TControl。

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多