gpt4 book ai didi

delphi - Delphi:如何使用无窗口控件?

转载 作者:行者123 更新时间:2023-12-03 15:18:07 25 4
gpt4 key购买 nike

我知道windowless controls are not magic。无窗口控件可以具有输入焦点(例如Internet Explorer)。输入焦点只不过是绘制:


a blinking cursor
a dotted line around the perimeter
a slight blue tinge on a button


当用户开始融合密钥时,会做出适当的反应。您知道按键是针对该集中控制的,因为这是该控制具有焦点的。

对于我的(Windows®)窗口,我必须知道我的无窗口子控件(假设它是TGraphicControl的后代)会获取键盘事件。因此,在表单的OnKeyDownOnCharOnKeyUp中,我需要假装它们将进入我的无窗口子控件。

我能做的,但是很痛苦。

但是,然后用户可能要使用Tab导航,而我将不得不以某种方式拦截Delphi的常规Tab控件顺序处理,并让我自己说这是Tab顺序中的下一个(也是上一个)。

我能做的,但是很痛苦。

然后是ActiveControl,除了TWinControl之外什么都不懂。因此,如果Delphi曾经试图弄清楚谁拥有焦点,那将会发疯。所以我必须要有ActiveControl的替代实现。

我能做的,但是很痛苦。

换句话说:这是太多的工作吗?我正在与Delphi斗争,所以我可以通过键盘输入访问几十个无窗口控件吗? Delphi设计师从未考虑过使用交互式无窗口控件,如果我现在尝试使用它,我会陷入hurtlocker吗?

德尔斐给了我一个愿意帮助我的机会,但是我选择了痛苦的方式。



需要对无窗口控件进行一些进一步的解释。

并非您与之交互的每个控件都必须是Windows控件。非常有可能专注于非Windows窗口的控件并向其发送键盘输入。

例如,您在Internet Explorer浏览器窗口中看到的几乎每个控件都是无窗口控件。在以下屏幕截图中,您可以看到一个编辑控件(可以键入)和一个按钮(在此屏幕截图中)具有焦点:

alt text


您可以看到虚线的焦点矩形,并且该按钮是带蓝色的(在Windows上该按钮表示它具有焦点)。

如果在Google Search按钮具有焦点的情况下按空格键,它将按此按钮。之所以起作用,是因为Microsoft编写了一个完整的控件窗口小部件库。这些控件的外观(感觉)(几乎)与常规通用控件完全相同-它们几乎是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开发人员社区的知识。

我在问一个问题。

最佳答案

构建无窗口控件并将其放入Delphi的VCL框架中是徒劳的。

您以Internet Explorer为例。但是在那种情况下,它完全负责其中的所有内容。它对主动控件是什么有自己的内部概念,但是从外部考虑它的外观:它只是一个巨大的控件。当您问操作系统什么是焦点时,无论浏览器的哪个子控件似乎都具有焦点,单个浏览器控件都会拥有焦点。

当您按Tab键时,它看起来就像浏览器只是使用了Tab键一样,就像编辑控件一样,在操作系统上看起来也是如此。编辑控件将光标移到几个空格上,并在其内部缓冲区中添加制表符。浏览器控件将光标移动到显示的其他区域。

您正在考虑在Delphi TForm上进行所有这些操作。 Delphi表单已经有了一个用于管理主动控件和处理击键的框架,您将必须全力以赴。如果要使用无窗口控件,请使用Internet Explorer路线并构建自己的容器控件来容纳它们,以便您可以负责其中发生的所有事情。

您的容器可以是VCL控件,但您放置在其上的内容可能不能—他们仍然期望使用VCL焦点和键盘处理规则。请注意,您也无法将普通的Windows控件放入Internet Explorer。您放置在此处的所有内容都需要通过特定的ActiveX接口。也许您也需要接口,或者也许您可以制作自己的控件类集,这些控件类源自您设计用于容器的某些特殊祖先类。不要以TGraphicControl开头;它在VCL中根深蒂固,无法用作分支控制库的基础。

这将需要大量工作,但是Internet Explorer也是。

关于delphi - Delphi:如何使用无窗口控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com