如何在运行时计算 TCategoryButtons 的高度?

问题描述

在 Windows 10 中的 Delphi 10.4.2 VCL 应用程序中,如何在运行时计算 TCategoryButtons 对象的高度,即其所有按钮高度及其类别项的总和,作为此高度可能会因字体大小而异?

在运行时测量像素高度,我注意到所有按钮的高度都相同,而且按钮的高度与类别项的高度不同。

另外,请注意按钮在对象检查器中没有发布的高度属性

但是难道不应该用一些低级方法来计算其所有按钮高度及其类别项的总和吗?

解决方法

这是一个完全用 Pascal 实现的控件,在 Vcl.CategoryButtons.pas 中。

因此,您可以确切地看到它是如何实现的。例如,在 TCategoryButtons.Paint 中,您可以看到其完整的绘图代码。同样,您可以调查在 MouseMove(或 MouseDownMouseUp)中完成的命中测试。

因此,如果不出意外,您可以使用此代码创建自己的 TCategoryButtons 修改版本。您的版本可以在确定后保存总高度(例如,肯定在绘画之后)。

但是,快速浏览之后,似乎 TButtonCategory.Bounds 可能很有趣。如果幸运的话,这将返回一个类别的屏幕矩形。最后一个类别的 rect 的 Bottom 应该是整个控件的(有效使用的)高度。

它似乎对我有用:

Screen recording of a TCategoryButtons control being used (categories colapsed and expanded,buttons moved between categories). As the controls effectively used height varies,a red bar's height is updated accordingly.

这里我画了一个与控件高度相同的红色条。

procedure TForm5.FormPaint(Sender: TObject);
begin
  var y := CategoryButtons1.Categories[
    CategoryButtons1.Categories.Count - 1
  ].Bounds.Bottom;
  Canvas.Brush.Color := clRed;
  Canvas.FillRect(Rect(0,ClientWidth,y))
end;