我知道无窗口控件并不神奇。无窗口控件可以具有输入焦点(例如 Internet Explorer)。输入焦点无非就是绘制:
当用户开始捣碎键时,做出适当的反应。你知道击键是为了那个有焦点的控件,因为那个控件有焦点。
对于我的 (Windows®) 窗口,我必须知道我的无窗口子控件(假设它是 TGraphicControl 的后代)获取键盘事件。所以在我的表格OnKeyDown
中OnChar
,OnKeyUp
我需要假装他们要去我的无窗儿童控制。
我可以做到,但这是一种痛苦。
但是随后用户可能会想要使用Tab导航,我将不得不以某种方式拦截 Delphi 的正常选项卡控制顺序处理,并让自己说这件事是选项卡顺序中的下一个(和上一个)。
我可以做到,但这是一种痛苦。
然后是,它除了'ActiveControl
什么都不理解。TWinControl
因此,如果 Delphi 试图弄清楚谁有焦点,那它会发疯的。所以我必须有一个 ActiveControl 的替代实现。
我可以做到,但这是一种痛苦。
换句话说:这是不是工作量太大了?我正在与 Delphi 的所有东西作斗争,所以我可以通过键盘输入访问几十个无窗口控件?Delphi 的设计者从来没有考虑过使用交互式无窗口控件,如果我现在尝试使用它,我会卡在伤害储物柜中吗?
Delphi给了我心甘情愿地帮助我的机会,但我选择了痛苦的方式。
需要对无窗口控件进行一些进一步的解释。
并非您与之交互的每个控件都必须是 Windows 控件。很有可能将焦点放在非 Windows 窗口的控件上并将键盘输入发送到该控件。
例如,您在 Internet Explorer 浏览器窗口中看到的几乎每个控件都是无窗口控件。在以下屏幕截图中,您可以看到一个可以输入的编辑控件,以及一个(在此屏幕截图中)具有焦点的按钮:
您可以看到虚线的焦点矩形,并且按钮是蓝色的(在 Windows 上表示它具有焦点)。
如果我Spacebar在Google Search
按钮有焦点时按下,它会按下按钮。之所以可行,是因为 Microsoft 编写了一个完整的控件小部件库。这些控件的外观和感觉(几乎)与常规的常用控件完全一样——它们几乎是 Windows 常用控件的完全克隆,一直到应用的主题。
Mozilla Firefox 和 Google Chrome 也使用控件的小部件库。它们不使用 Microsoft 的内置窗口控件,而是使用图形、交互式、无窗口小部件库。
如果你有一个合适的开发环境,那么无窗口小部件就像“普通”窗口控件一样工作。GTK+ 是一个小部件库,而 Glade 是一个 IDE,可让您在该小部件库中布局控件。
我不知道 Firefox、Chrome 或 Blender 是在什么开发环境中创建的,但它们的小部件支持无窗口控件。
所以现在开始我的问题。
除非我弄错了,在我看来,虽然 Delphi 支持 base TControl
(它有宽度、高度,并且可以自己绘制),但它无法接收键盘焦点。在我看来,Borland 从未将 Delphi 的 VCL 设计为通用的小部件库。我必须支持这一点的唯一证据是表单ActiveControl
是 TWinControl:
property ActiveControl: TWinControl;
这并不意味着 Delphi 可以或必须仅限于窗口控件。VCL 小部件库可以扩展以支持将焦点放在无窗口控件上。
但也许Delphi 已经支持无窗口控件,而我只是没有意识到?Delphi 中是否已经建立了支持关注TControl
's 的机制?但我是一个相当聪明的人,而且我很确定 Delphi 的 VCL 不能做其他小部件库可以做的事情。
这又引出了另一个问题:子类化表单等支持它需要做多少工作?是否还有其他人,也许是 TeamB 中的某个人,比我聪明得多,已经尝试过,并得出结论认为这是不可能的?
我现在先问一下,如果尝试添加无窗口控制支持几乎是不可能的(即徒劳的) - 这样我就不会白白花费数周时间。我正在尝试利用 Delphi 开发人员社区的知识。
我在问一个问题。