我知道无窗口控件并非神器。无窗口控件可以获得输入焦点(如Internet Explorer)。输入焦点只不过是绘制以下内容之一:
当用户开始按键时,会适当做出反应。您知道这些按键是针对那个被聚焦的控件的,因为该控件具有聚焦状态。
在我的(Windows®)窗口的情况下,我需要知道我的无窗口子控件(让我们假装它是TGraphicControl的后代)获得键盘事件。因此,在我表单的 OnKeyDown
,OnChar
,OnKeyUp
期间,我需要假装它们是要去我的无窗口子控件。
我可以做,但它很痛苦。
但用户可能会想要使用Tab导航,然后我将不得不以某种方式拦截Delphi的正常Tab控件顺序处理,并钩入自己以指出这个东西是下一个(和上一个)在Tab顺序中的项目。
我可以做,但它很痛苦。
然后就有了ActiveControl
,它只理解TWinControl
。因此,如果Delphi尝试找出谁拥有焦点,它将变得疯狂。所以我需要有一个替代的ActiveControl
实现。
我可以做,但它很痛苦。
换句话说:这是不是太麻烦了? 为了让几十个无窗口控件可通过键盘输入进行操作,我正在与Delphi的一切战斗。Delphi的设计师从未考虑过使用交互式无窗口控件,如果我现在尝试工作,我将陷入困境,就像拆弹部队一样。
Delphi 给了我乐意帮助我的机会,但我选择了痛苦的道路。
Some further explanation of windowless controls is needed.
并非你们相互交往的每一种控制都必须是窗户控制。 很可能把重点放在而不是视窗的控制权上,并将主要投入到这种控制上。
例如,几乎在Internet Explorer浏览器窗口中看到的每个控件都是无窗口控件。在以下屏幕截图中,您可以看到一个编辑控件,您可以在其中输入,以及一个按钮,该按钮(在此屏幕截图中)具有焦点:
您可以看到虚点聚焦矩形,而按钮是蓝色的(在Windows上表示它具有焦点)。
如果我在焦点在Google搜索
按钮的情况下按下空格键,它将按下按钮。之所以可以这样做,是因为微软编写了一个完整的小部件控件库。这些控件看起来和感觉(几乎)与常规公共控件完全相同 - 它们非常接近于Windows公共控件的精确克隆,包括应用主题。
Mozilla Firefox 和 Google Chrome 也使用了一套控件窗口的小部件库。它们不使用 Microsoft 内置的窗口控件,而是使用了一个图形化、交互式、无窗口的小部件库。
如果你有适当的开发环境,那么无窗口小部件就像“普通”的窗口控件一样工作。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开发者社区的知识。
i m 提问。