Delphi 10.4 中 VCL表单的自定义标题栏

TForm.CustomTitleBar属性和新的TTitleBarPanel控制允许您自定义一个VCL形式的类似于Windows资源管理器原生标题栏,谷歌Chrome或其他应用程序。您可以在标题栏上放置VCL控件,在标题栏上放置自定义绘制,还可以控制元素的默认绘制,例如窗口图标和标题。

“”
注意: Windows 7和更高版本支持自定义标题栏。

自定义标题栏支持使用正版机Windows标题栏,使能依靠DWM(桌面窗口管理器)。在Windows 7上关闭Aero或其他不使用DWM渲染窗口的情况,将导致不支持标题栏自定义。这是由控件正常处理的,但是要在代码中检查这种情况,请检查TForm.CustomTitleBar.Supported的值。当您可以使用自定义标题栏时,这是True。

要利用自定义标题栏的全部功能,必须组合使用TForm.CustomTitleBar属性和放置在窗体上的TTitleBarPanel该面板用于承载VCL控件,但是即使标题栏上没有自定义控件,也需要启用高级功能,例如自定义绘画。基本上,TForm.CustomTitleBar属性表示表单标题栏的设置,而TTitleBarPanel是VCL控件,用于表示和访问标题栏本身的高级功能。

基本定制

VCL TForm的类有一个新的属性,CustomTitleBar这使您可以更改基本属性,例如显示标题或图标,以及控制更高级的功能,包括放置控件。

要启用标题栏自定义,请将TForm.CustomTitleBar.Enabled设置为True。请注意,设计器中VCL表单的顶部现在将具有阴影蓝色区域。这表示将用于标题栏的表单区域。

VCL控制位置

标题栏是通过  DwmExtendFrameIntoClientArea 函数实现的,这意味着您的表单没有非工作区,并且标题栏将使用某些工作区(即可以放置VCL控件的空间)来呈现。

带有Align属性的所有带有该控件的控件(例如alTop)都将正确调整到标题栏区域。但是,通过“左”和“上”属性放置的任何控件(即绝对位置)都将保留在原处,因此可能与标题栏重叠,并且在启用自定义标题栏时需要调整其位置。

我们建议您将控件放置在您的窗体上,以客户为导向的TPanel。请注意,您可能还希望将窗体的“ Height”变大,以解决标题栏以前使用的空间。

设置和部分自定义绘画

以下设置控制标题栏的行为,并控制一些常见的绘制方案(例如不绘制标题栏标题),使您可以解决这些方案而无需实施完全自定义绘制。

  • CaptionAlignment使用它可以指定在何处绘制字幕。Windows 10默认情况下位于左侧。您可以以Windows 8为中心或右对齐绘制字幕。
  • 控件将其设置为放置在窗体上的TTitleBarPanel。请参阅以下有关标题栏上的自定义控件的部分。
  • 已启用激活或停用自定义标题栏的使用。
  • 高度标题栏的高度,以像素为单位。要更改标题栏的高度,请关闭 SystemHeight,它将标题栏限制为默认的系统高度。然后,您可以将Height属性设置为任何值。
  • ShowCaption控制是否绘制字幕。
  • ShowIcon控制是否在标题栏的左边缘绘制表单的图标。
  • SystemHeight设置为True时,标题栏高度始终是当前屏幕上其他窗口使用的值。若要自定义标题栏的高度,请禁用 SystemHeight,然后在Height属性中输入一个值。
  • SystemColors控制标题栏标题和按钮是使用系统颜色还是启用或禁用时使用自定义颜色。当您想要使用与系统使用不同的背景和前景色绘制标题栏,而无需完全自定义绘制时,这很有用。
设置为True时,背景,标题和系统按钮会像其他应用程序一样使用系统默认颜色进行绘制。如果为False,则使用您在颜色属性中提供的颜色(请参见下文)。
对于要使用的自定义颜色,您必须将TTitleBarPanel放置在窗体上,并将CustomTitleBar.Control属性设置为该颜色,这与您计划将控件放置在标题栏上的想法完全相同,即使标题栏面板为空并且不包含任何内容。控件。

全定制绘画

您可以通过在标题栏上绘画并在其上绘制任何内容来完全自定义标题栏的呈现方式。为此,您必须将TTitleBarPanel放置在表单上,​​并将CustomTitleBar.Control属性设置为该属性,这与您打算将控件放置在标题栏上的方式完全相同,即使标题栏面板为空并且不包含任何控件也是如此。然后,您可以为TTitleBarPanel.OnPaint事件创建事件处理程序

TTitleBarPanel.OnPaint事件被称为绘画的最后阶段。绘画将覆盖标题栏上已经绘画的任何其他内容,例如标题或系统按钮。您还可以使用Rect属性自定义图形。IconRectFrameRectClientRectCaptionButtonsRect性能帮助您知道哪里有系统的按钮,字幕等的位置。

油漆是32位的表面。它具有与Windows 7中在玻璃上绘画相同的绘画要求。

字幕按钮

您可以将自定义字幕按钮添加到标题栏。这在IDE本身中用于在通常在标题栏上看到的“最小化” /“最大化” /“关闭”按钮的左侧添加“帮助”和“桌面”按钮。

为此,将一个TTitleBarPanel放置在窗体上,并将其设置为窗体的CustomTitleBar.Control属性,如上文所述。然后,您可以通过面板的CustomButtons属性添加自定义按钮。这是TCaptionButtonItem的集合。从“最小化”按钮的左侧开始,按从右到左的顺序自动排列按钮。集合中的第0个按钮将在最右边,最后一个按钮将在最左边。在Windows 7上,最小化按钮和第一个自定义按钮之间的空间很小。

TCaptionButtonItem组件表示标题栏上的按钮。它具有以下属性:

  • ButtonType:允许您使用系统按钮,例如关闭,最小化或还原,添加空格或具有完全自定义的按钮。通常,您将使用自定义按钮。
  • 已启用:如果已关闭,则将绘制该按钮,并且该按钮不会响应鼠标的移动或单击。
  • 提示:允许您指定当鼠标悬停在按钮上方时显示的工具提示。
  • 可见:控制按钮是否在标题栏上绘制。
  • 宽度:控制按钮的宽度。
  • OnClick:单击按钮时的事件处理程序。
  • OnPaint:要在按钮上绘制的事件处理程序,例如按钮字形。按钮不连接到图像列表。

Windows 7和10支持

自定义标题栏完全支持Windows 7和Windows 10,包括字幕按钮:

“”

Windows 7上的RAD Studio标题栏。

注意:

不支持Windows Vista或更早版本。

Windows 8支持自定义标题栏,但与其他应用程序相比,可能会有一些视觉差异,例如自定义其颜色时如何绘制系统按钮(它们将像Windows 10按钮那样呈现)。

自定义控件

所述TTitleBarPanel控制被用来代替控制在VCL形式的标题栏区。它是一个为控件提供设计时支持的容器。它还保持了表单和自定义标题栏区域之间的关系。

放置在标题栏上的控件必须支持在32位表面上的绘图,类似于Windows 7中的玻璃。作为一般指导,如果控件在Windows 7中正确显示在玻璃上,则很可能会正确显示在Windows 7的标题栏上。 Windows 7和10。即使在设计器中,放置控件并看到其渲染错误也很常见。对于常规的VCL控件,您可能需要使用DoubleBuffered之类的属性。

要将控件放置在标题栏上:

  • 选用板中,找到TTitleBarPanel控件并将其放置在窗体上。它将显示在表单顶部。
  • 将窗体的CustomTitleBar.Control属性设置为新的标题栏面板。您将看到面板具有蓝色背景色,并在其右侧显示系统按钮。
  • (可选)更改标题栏面板的Height属性以匹配CustomTitleBar.Height属性。只有标题栏高度内的控件才会在标题栏本身上呈现。
  • 选用板中,找到一个控件,例如TEdit,然后使用以下控件将其放置在TTitleBarPanel上:
    • 在对象检查器中,将新控件的DoubleBuffered属性设置为True。
    • 由于TTitleBarPanel是普通的VCL控件,因此可以为放置在其上的控件设置Align,Anchors和其他定位属性。若要使您的编辑控件在系统按钮旁边右对齐(可能是搜索编辑),请将其拖动到正确的位置,然后更改Anchors属性以删除akLeft并添加akRight。

“”

返回表单,添加一个OnShow事件,或者如果您想在标题栏中手动放置控件而不是使用对齐方式或锚点,请使用OnResize。(我们建议使用对齐方式和锚点,因为通过OnResize定位可能会在视觉上滞后于窗口大小)。您可以参考CustomTitleBar的IconRectFrameRectClientRectCaptionButtonsRect属性,以将控件相对于标题栏的已知部分定位。在这里,通过将以下代码行添加到事件处理程序,将编辑控件的Left属性设置为CaptionButtonsRect.Left减去编辑宽度再减去一小部分空白(仅用于视觉美学)。

 

Edit1.Left := CustomTitleBar.CaptionButtonsRect.Left - Edit1.Width - 8;

“”

 

添加新评论

纯文本

  • 不允许使用HTML标签。
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
请输入图片中的字符,不区分大小写