【问题标题】:How to calculate the height of a TCategoryButtons at run-time?如何在运行时计算 TCategoryButtons 的高度?
【发布时间】:2021-09-26 03:16:41
【问题描述】:

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

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

另外,请注意按钮在 Object Inspector 中没有发布的 Height 属性。

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

【问题讨论】:

  • 当然,高度也取决于ButtonOptions:例如,您可以在按钮旁边或上方放置类别标题;您可以每行有一个按钮或每行有多个按钮(自动换行!)。

标签: delphi vcl delphi-10.4-sydney


【解决方案1】:

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

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

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

但是,快速浏览后,TButtonCategory.Bounds 似乎很有趣。如果幸运的话,这会返回一个类别的屏幕矩形。最后一个类别的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;

【讨论】:

  • 这是一个巧妙的想法,而且效果很好!但是,当在 Form 的 OnPaint 事件中使用此方法设置 CategoryButtons 的高度时,我必须添加 1 像素偏移 以避免 CategoryButtons 控件中的滚动条:CategoryButtons1.Height := CategoryButtons1.Categories[CategoryButtons1.Categories.Count - 1].Bounds.Bottom + 1; BTW,使用此方法我可以实现从TCategoryButtons 派生的控件的Autosize 属性。
  • 原来偏移量依赖于BorderWidth。 (在我的实际案例中,我使用BorderStyle = bsNoneBorderWidth = 0)。因此,当使用边框宽度 > 0 时,公式应为:CategoryButtons1.Height := CategoryButtons1.Categories[CategoryButtons1.Categories.Count - 1].Bounds.Bottom + 1 + CategoryButtons1.BorderWidth
  • 顺便说一句,看看你所有巧妙的解决方案,IMO 你应该是 Embarcadero 的顶级开发人员!
  • @user1580348:正确。绘制控件内容时使用的坐标是它的客户区坐标,它不包括边框(如果你比较一个表单的HeightClientHeight,比如说)。我意识到我应该在发布 A 之后删除边框(或者像你一样在公式中添加边框宽度),但是懒得重做屏幕录制(也许我老了)。并感谢您的赞美!
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多