【问题标题】:How to get the size of a Winforms Form titlebar height?如何获取 Winforms 表单标题栏高度的大小?
【发布时间】:2010-01-07 18:32:22
【问题描述】:

因此,如果它是工具窗口或最小化表单,我希望能够以编程方式获取其高度。

这可能吗?如果有怎么办?

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    您可以使用以下方法确定工具窗口和普通表单的标题栏高度:

    Rectangle screenRectangle = this.RectangleToScreen(this.ClientRectangle);
    
    int titleHeight = screenRectangle.Top - this.Top;
    

    “this”是您的表单。

    ClientRectangle 返回表单客户区的边界。 RectangleToScreen 将此转换为屏幕坐标,该坐标系与表单屏幕位置相同。

    【讨论】:

    • 我相信这是更好的解决方案。 SystemInformation.CaptionHeight 只会给出顶级窗口的标题栏高度(我相信),并且不适用于 ToolWindows,所以这更通用一些。
    • +1 来自我,我也相信这是更好的解决方案。 “SystemInformation.CaptionHeight”似乎不适用于 ToolWindows。
    • 我不太确定这是否正确。 Aero 出于 appcompat 的原因对窗口位置撒谎。它的粗边框是一个棘手的问题。
    • 嗯,我没想到这个。所以你认为没有办法做到这一点?那我真的很惊讶。
    • 我不知道可能的 Aero 问题,但是当表单是 Developer Express XtraForm 时,这种技术对我确定表单的标题栏高度和边框宽度很有用,这些因素取决于用户选择的皮肤。
    【解决方案2】:

    如果您的表单是 MDI 应用程序中的视图,则会出现额外的问题。在这种情况下,RectangleToScreen(this.ClientRectangle) 返回的坐标不是相对于 Form 本身(正如人们可能期望的那样),而是相对于 MainForm ,它承载了承载 Form 的 MDIClient 控件。

    您可以通过

    来说明这一点
    Point pnt = new Point(0, 0);
    Point corner = this.PointToScreen(pnt); // upper left in MainFrame coordinates
    Point origin = this.Parent.PointToScreen(pnt); // MDIClient upperleft in MainFrame coordinates
    int titleBarHeight = corner.Y - origin.Y - this.Location.Y;
    

    【讨论】:

      【解决方案3】:

      这将为您提供 TitleBarsize:

      form.ClientRectangle.Height - form.Height;
      

      【讨论】:

      • 不完全是。这为您提供了 非客户区 的高度。在实践中,如果没有其他非客户区,这可能与标题栏的高度相同,但不一定相同。那么,从语义上讲,代码是错误的。
      • 这是错误的,句号。他正在从客户区中减去表格。那是倒退。
      【解决方案4】:

      在我的例子中,我不得不更改表单的高度,使其刚好低于其中一个控件,我注意到了

        int titleHeight = this.Height - screenRectangle.Height;
      

      返回 39 而接受的答案:

        int titleHeight =  screenRectangle.Top - this.Top;
      

      返回 31

      可能是因为表单的底部边框。

      【讨论】:

        【解决方案5】:

        要修正 S. Norman 的答案,即简单地将他的被减数和​​被减数转换,以下是最简单的答案:

        int HeightOfTheTitleBar_ofThis = this.Height - this.ClientRectangle.Height;

        顺便说一句,标准的硬编码标题栏是 25dpi,这是最小高度,可以更改为最大 50dpi。

        好的好的,...是的,它在技术上是不正确的正如 Cody Gray 所说,但它可以工作并且应该得到与接受的答案相同的答案。无需创建矩形。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 1970-01-01
          相关资源
          最近更新 更多