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

How to calculate the height of a TCategoryButtons at run-time?

在 Delphi 10.4.2 VCL Application in Windows 10 中,如何计算 TCategoryButtons 对象在 运行 时间的高度,即所有按钮高度及其类别项目的总和,因为此高度可能会根据其字体大小而变化?

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

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

但是用一些低级方法计算它的所有按钮高度和它的类别项的总和是不是应该是可能的?

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

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

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

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

它似乎对我有用:

这里我画了一个和控件一样高的红色条。

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