【发布时间】:2011-01-19 22:18:48
【问题描述】:
我知道windowless controls are not magic。无窗口控件可以具有输入焦点(例如 Internet Explorer)。输入焦点也无非是绘图:
当用户开始混合键时,做出适当的反应。你知道击键是为了那个有焦点的控件,因为那个控件有焦点。
对于我的 (Windows®) 窗口,我必须知道我的无窗口子控件(让我们假装它是 TGraphicControl 的后代)获取键盘事件。所以在我的表单OnKeyDown、OnChar、OnKeyUp 中,我需要假装他们要去我的无窗口子控件。
我能做到,但很痛苦。
但随后用户可能会想要使用 Tab 导航,我将不得不以某种方式拦截 Delphi 的正常选项卡控制顺序处理,并让自己说 这件事 是 Tab 键顺序中的下一个(和上一个)。
我能做到,但很痛苦。
然后是ActiveControl,除了TWinControl,它什么都不懂。因此,如果 Delphi 试图弄清楚谁有焦点,那它会发疯的。所以我必须有一个 ActiveControl 的替代实现。
我能做到,但很痛苦。
换句话说:这是不是工作量太大了?我正在与 Delphi 的所有东西作斗争,所以我可以通过键盘输入访问几十个无窗口控件? Delphi 的设计者从来没有考虑过使用交互式无窗口控件,如果我现在尝试使用它,我会卡在hurtlocker?
Delphi给了我心甘情愿帮助我的机会,但我选择了痛苦的方式。
需要对无窗口控件做一些进一步的解释。
并非您与之交互的每个控件都必须是 Windows 控件。很有可能将焦点放在非 Windows 窗口的控件上并将键盘输入发送到该控件。
例如,您在 Internet Explorer 浏览器窗口中看到的几乎每个控件都是无窗口控件。在以下屏幕截图中,您可以看到一个可以输入的 edit 控件,以及一个(在此屏幕截图中)具有焦点的按钮:
您可以看到虚线的焦点矩形,并且按钮是蓝色的(在 Windows 上表示它有焦点)。
如果我在Google Search 按钮获得焦点时按空格键,它将按按钮。之所以可行,是因为 Microsoft 编写了一个完整的控件小部件库。这些控件的外观和感觉(几乎)与常规常用控件完全一样——它们几乎是 Windows 常用控件的完全复制品,直至应用的主题。
Mozilla Firefox 和 Google Chrome 也使用控件的小部件库。它们不使用 Microsoft 的内置窗口控件,而是使用图形化、交互式、无窗口 widgets 库。
如果您有合适的开发环境,那么无窗口小部件就像“普通”窗口控件一样工作。 GTK+ 是一个小部件库,而 Glade 是一个 IDE,可让您在该小部件库中布局控件。
我不知道 Firefox、Chrome 或 Blender 是在什么开发环境中创建的,但它们的小部件支持无窗口控件。
那么现在来回答我的问题。
除非我弄错了,在我看来,虽然 Delphi 支持基础TControl,(它具有宽度、高度,并且可以自己绘制),但它无法接收键盘焦点。在我看来,Borland 从未将 Delphi 的 VCL 设计为通用的小部件库。我必须支持这一点的唯一证据是表单的 ActiveControl 是 TWinControl:
property ActiveControl: TWinControl;
这并不意味着 Delphi 可以或必须仅限于窗口控件。可以扩展 VCL 小部件库以支持将焦点放在无窗口控件上。
但也许 Delphi 已经支持无窗口控件,我只是没有意识到? Delphi 中是否已经建立了支持关注TControl 的机制?但我是一个相当聪明的人,而且我很确定 Delphi 的 VCL 无法做到其他小部件库可以做到的事情。
这又引出了另一个问题:子类化表单需要做多少工作才能支持它?那里还有其他人,也许是 TeamB 中的某个人,比我聪明得多,谁已经尝试过了,并得出了不可能的结论?
我现在先问一下,如果尝试添加无窗口控件支持几乎是不可能的(即徒劳无功) - 所以我不会白白花费数周时间。我正在尝试利用 Delphi 开发人员社区的知识。
我在问一个问题。
【问题讨论】:
-
投票结束为“不是一个真正的问题”。一旦你去掉了装饰,真的没有。 @Ian,SO 是一个问答网站,它试图帮助您(以及以后有类似问题的其他人)获得对 real 问题的良好答案。如果你不知道自己为什么要做这一切,其他人应该怎么做?
-
Delphi 是否有支持无窗口控件的 Widget 库(无论是 Borland 的 VCL 还是其他库)?或者,窗口控件的概念是否深入到 Delphi 中,以至于 a) 不仅不存在,而且 b) 如果不丢弃 Delphi IDE 所提供的几乎所有东西,几乎不可能创建一个?
标签: delphi windowless